Unified container management for Apptainer and Docker
Project description
SciTeX Container
Unified container management for Apptainer/Singularity and Docker — versioned SIFs, atomic switch/rollback, and reproducible env snapshots.
Full Documentation · uv pip install scitex-container[all]
Problem and Solution
| # | Problem | Solution |
|---|---|---|
| 1 | "Reproducible" containers drift -- Dockerfile builds a different image each time because apt-get install python3 floats |
Versioned SIF -- scitex-container build pins the image content hash; switch-version 2.19.5 is an atomic symlink flip |
| 2 | Rollback requires docker tags + manual surgery -- something breaks in prod; reverting to yesterday's container is 15 minutes of yak-shaving | rollback is one command -- previous active SIF restored; sandbox state preserved |
| 3 | Paper "env" is pip freeze -- useless without the python version, OS libs, CUDA driver |
env_snapshot() -- full reproducibility capsule: container tag + pip freeze + conda env + apt packages + git commits, serialized as a single file for manuscript attachments |
Architecture
scitex-container/
├── src/scitex_container/
│ ├── __init__.py # apptainer, docker, host, env_snapshot
│ ├── apptainer/
│ │ ├── _build.py # build SIF from def file (pinned hash)
│ │ ├── _versions.py # list / switch / rollback (atomic symlink)
│ │ ├── _verify.py # SIF + lock-file integrity
│ │ └── _exec.py # build_exec_args for cloud terminal
│ ├── docker/ # rebuild / restart compose services
│ ├── host/ # TeX Live, ImageMagick, bind mounts
│ ├── _snapshot.py # env_snapshot(): pip + conda + apt + git
│ ├── _cli/ # scitex-container entrypoint
│ └── _mcp_tools/ # MCP server (opt-in)
└── tests/
Installation
Requires Python >= 3.10.
pip install scitex-container
With MCP server support (for AI agent integration):
pip install scitex-container[mcp]
Full installation:
pip install scitex-container[all]
Quick Start
# Unified status dashboard
scitex-container status
# Build Apptainer SIF from definition file
scitex-container build --def-name scitex-final
# Version management
scitex-container list
scitex-container switch 2.19.5
scitex-container rollback
# Show all commands
scitex-container --help-recursive
Four Interfaces
Python API
import scitex_container
# Apptainer container management
scitex_container.apptainer.build(def_name="scitex-final", sandbox=True)
scitex_container.apptainer.list_versions(containers_dir="/opt/containers")
scitex_container.apptainer.switch_version("2.19.5", containers_dir="/opt/containers")
scitex_container.apptainer.rollback(containers_dir="/opt/containers")
# Host package management
scitex_container.host.check_packages()
# Docker operations
scitex_container.docker.rebuild(env="prod")
scitex_container.docker.restart(env="prod")
# Environment reproducibility snapshot
snapshot = scitex_container.env_snapshot()
Verification API
from pathlib import Path
import scitex_container
# Verify container integrity
result = scitex_container.apptainer.verify(sif_path="/opt/containers/scitex-final.sif")
# Returns: {sif, def_origin, pip_lock, dpkg_lock, overall}
# Command builder for scitex-cloud terminal integration
args = scitex_container.apptainer.build_exec_args(
container_path="/opt/containers/scitex-final.sif",
username="user01",
host_user_dir=Path("/data/users/user01"),
host_project_dir=Path("/data/projects/proj01"),
project_slug="proj01",
texlive_prefix="/usr",
)
CLI Commands
scitex-container status # Unified dashboard
scitex-container build scitex-final # Build SIF
scitex-container list # List versions
scitex-container switch 2.19.5 # Switch version
scitex-container rollback # Revert to previous
scitex-container verify # Verify SIF integrity
scitex-container env-snapshot # Reproducibility snapshot
Sandbox Operations
scitex-container sandbox create --sif scitex-final.sif
scitex-container sandbox maintain --sandbox scitex-sandbox/
Host Package Management
scitex-container host install # Install TeX Live + ImageMagick
scitex-container host check # Verify host packages
scitex-container host mounts # Show configured bind mounts
Docker Operations
scitex-container docker rebuild # Rebuild Compose services
scitex-container docker restart # Restart services
MCP Server
scitex-container exposes an MCP server so AI agents (Claude, etc.) can manage containers autonomously.
# Start MCP server
scitex-container-mcp
# Diagnostics and tool listing
scitex-container mcp doctor
scitex-container mcp list-tools -vv
| Tool | Description |
|---|---|
status |
Unified container/host status dashboard |
build |
Build SIF from definition file |
list |
List available container versions |
switch |
Switch active container version |
rollback |
Roll back to previous version |
sandbox_create |
Create writable sandbox from SIF |
docker_rebuild |
Rebuild Docker Compose services |
host_install |
Install host-side packages |
env_snapshot |
Capture reproducibility snapshot |
verify |
Verify SIF integrity against lock files |
Skills
Skills provide workflow-oriented guides that AI agents query to discover capabilities and usage patterns.
scitex-container skills list # List available skill pages
scitex-container skills get SKILL # Show main skill page
scitex-dev skills export --package scitex-container # Export to Claude Code
| Skill | Content |
|---|---|
quick-start |
Install and first-use examples |
python-api |
Full Python API with signatures |
cli-reference |
CLI commands reference |
mcp-tools |
MCP tools for AI agents |
environment |
Environment variables |
Demo
sequenceDiagram
participant U as user
participant SC as scitex-container
participant FS as /opt/containers
U->>SC: build --def-name scitex-final
SC->>FS: scitex-final-2.19.6.sif (pinned)
U->>SC: switch 2.19.5
SC->>FS: active.sif -> scitex-final-2.19.5.sif
U->>SC: rollback
SC->>FS: active.sif -> scitex-final-2.19.6.sif
U->>SC: env-snapshot
SC-->>U: snapshot.json (SIF hash + pip + conda + apt + git)
Part of SciTeX
scitex-container is part of SciTeX. Install via
the umbrella with pip install scitex[container] to use as
scitex.container (Python) or scitex container ... (CLI).
import scitex_container
# Capture snapshot for Clew integration
snapshot = scitex_container.env_snapshot()
# snapshot includes: container version, SIF hash, lock files, host packages
Four Freedoms for Research
- The freedom to run your research anywhere — your machine, your terms.
- The freedom to study how every step works — from raw data to final manuscript.
- The freedom to redistribute your workflows, not just your papers.
- The freedom to modify any module and share improvements with the community.
AGPL-3.0 — because we believe research infrastructure deserves the same freedoms as the software it runs on.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scitex_container-0.2.1.tar.gz.
File metadata
- Download URL: scitex_container-0.2.1.tar.gz
- Upload date:
- Size: 5.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48a58d5737aed748ec0e3c4b7607c7105d7263c5cf364ec0592f19e94d6a3d91
|
|
| MD5 |
8e9e3e71535fcf2fe5ae917f5db7612e
|
|
| BLAKE2b-256 |
2f4eb9e835dc778735a9e772078595fa9f08c72cfb351c2e640a4abcfbda14e5
|
Provenance
The following attestation bundles were made for scitex_container-0.2.1.tar.gz:
Publisher:
pypi-publish-and-github-release-on-tag.yml on ywatanabe1989/scitex-container
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scitex_container-0.2.1.tar.gz -
Subject digest:
48a58d5737aed748ec0e3c4b7607c7105d7263c5cf364ec0592f19e94d6a3d91 - Sigstore transparency entry: 1642291497
- Sigstore integration time:
-
Permalink:
ywatanabe1989/scitex-container@9f699737938cb3baacb62d81e2225511b999d692 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/ywatanabe1989
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish-and-github-release-on-tag.yml@9f699737938cb3baacb62d81e2225511b999d692 -
Trigger Event:
push
-
Statement type:
File details
Details for the file scitex_container-0.2.1-py3-none-any.whl.
File metadata
- Download URL: scitex_container-0.2.1-py3-none-any.whl
- Upload date:
- Size: 4.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7500c0a60018c761eb3597a8160115560f670ccffd3e27108d4bd1c6a76555b4
|
|
| MD5 |
fcf2d7c1d164a1f1ac0d43aa4e95576a
|
|
| BLAKE2b-256 |
3ad7415b1e4f9983f33ef52e9bdbbd8b865c13809e6d01775d9b9b5246ebdc56
|
Provenance
The following attestation bundles were made for scitex_container-0.2.1-py3-none-any.whl:
Publisher:
pypi-publish-and-github-release-on-tag.yml on ywatanabe1989/scitex-container
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scitex_container-0.2.1-py3-none-any.whl -
Subject digest:
7500c0a60018c761eb3597a8160115560f670ccffd3e27108d4bd1c6a76555b4 - Sigstore transparency entry: 1642291674
- Sigstore integration time:
-
Permalink:
ywatanabe1989/scitex-container@9f699737938cb3baacb62d81e2225511b999d692 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/ywatanabe1989
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish-and-github-release-on-tag.yml@9f699737938cb3baacb62d81e2225511b999d692 -
Trigger Event:
push
-
Statement type: