{"id":26030482,"url":"https://github.com/mdbecker/pixi_jupyter_container","last_synced_at":"2026-03-06T22:33:44.843Z","repository":{"id":280182507,"uuid":"940880890","full_name":"mdbecker/pixi_jupyter_container","owner":"mdbecker","description":"Containerized env for running jupyterlab with my favorite libraries inside of a container using pixi","archived":false,"fork":false,"pushed_at":"2025-09-16T04:51:56.000Z","size":464,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-16T06:32:24.696Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mdbecker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-01T01:16:42.000Z","updated_at":"2025-09-16T04:52:00.000Z","dependencies_parsed_at":"2025-03-01T20:29:39.208Z","dependency_job_id":"908ee9cb-d95a-48c0-8692-6847a88004e4","html_url":"https://github.com/mdbecker/pixi_jupyter_container","commit_stats":null,"previous_names":["mdbecker/pixi_jupyter_container"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/mdbecker/pixi_jupyter_container","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdbecker%2Fpixi_jupyter_container","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdbecker%2Fpixi_jupyter_container/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdbecker%2Fpixi_jupyter_container/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdbecker%2Fpixi_jupyter_container/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mdbecker","download_url":"https://codeload.github.com/mdbecker/pixi_jupyter_container/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mdbecker%2Fpixi_jupyter_container/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30201021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-06T18:29:46.402Z","updated_at":"2026-03-06T22:33:44.817Z","avatar_url":"https://github.com/mdbecker.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Opinionated Custom JupyterLab Stack Container\n\nAn easy-to-maintain and modern JupyterLab environment built with Pixi (instead of Conda/Mamba). This container is designed to make it quick and easy to spin up jupyterlab with all my favorite tools, while keeping everything up to date.\n\n## Features\n\n- **Modern Package Management**: Utilizes [Pixi](https://github.com/prefix-dev/pixi) for fast environment creation and reliable dependency management.\n- **Standard Base Image**: Based on the official Ubuntu image (`ubuntu:latest`) to provide familiarity and broad compatibility.\n- **Up-to-date**: Pulls updates for the Ubuntu image, Pixi binary, and Python packages (as defined in `pixi.toml`) during each build.\n- **Pre-configured Extensions**: Includes JupyterLab extensions (`jupyterlab_execute_time`, `ipyflow`) that provide useful enhancements to the notebook interface.\n- **Automated Testing \u0026 Lock File Generation**: GitHub Actions regularly rebuild the container, execute smoke tests (checking imports for key Python libraries like NumPy, Pandas, and scikit-learn), and regenerate the `pixi.lock` file to record exact dependency versions, ensuring we always have the latest working versions.\n- **Built for ARM64**: Built natively for ARM64, ensuring compatibility with Apple Silicon.\n\n## Quick Start\n\nClone the repository and run:\n\n```bash\ndocker compose build\ndocker compose up\n```\n\nJupyterLab will be available at:\n\n```\nhttp://localhost:8888\n```\n\nBy default, token/password authentication is disabled for convenience during local development. (Do **not** use this configuration in production.)\n\n## Project Structure\n\n```\n.\n├── .dockerignore\n├── .github\n│   ├── release-drafter.yml\n│   └── workflows\n│       ├── ci-cd.yml\n│       └── release-drafter.yml\n├── Dockerfile\n├── LICENSE\n├── README.md\n├── docker-compose.yml\n├── pixi.toml\n├── pixi.lock\n└── start.sh\n```\n\n*Note:* The file `pixi.lock` is generated automatically during every build, capturing exact versions of all installed dependencies.\n\n## Dependency Management\n\nEnvironment dependencies are defined in `pixi.toml`:\n\n- **Modify package versions here:** Edit `pixi.toml` to add, remove, or adjust dependencies.\n- **Latest Versions on Every Build:** The container fetches the most current versions from external sources during builds. For example, the Dockerfile queries GitHub's API to download the latest Pixi binary, and the Ubuntu base image is always pulled using the `latest` tag.\n- **Lock File Snapshot:** Every build regenerates `pixi.lock`, capturing exact versions of all dependencies installed. This helps you track changes over time and pin specific dependencies as needed.\n\n### Manually Generating `pixi.lock`\n\nIf the automated build pipeline ever fails, you can manually generate the latest `pixi.lock` file by running:\n\n```bash\ndocker build -t pixi_jupyter_container:latest .\n\ndocker create --name temp-container pixi_jupyter_container:latest\ndocker cp temp-container:/home/jovyan/pixi.lock ./pixi.lock\ndocker rm temp-container\n```\n\nThen commit the updated `pixi.lock` file:\n\n```bash\ngit add pixi.lock\ngit commit -m \"Manually update pixi.lock\"\ngit push\n```\n\n## GitHub Container Registry (GHCR)\n\nBuilt images are automatically tagged and pushed to GHCR on every commit:\n\n- **Commit SHA Tag:**  \n  ```\n  ghcr.io/\u003cyour-username\u003e/pixi_jupyter_container:\u003ccommit-sha\u003e\n  ```\n- **Release Tag:**  \n  ```\n  ghcr.io/\u003cyour-username\u003e/pixi_jupyter_container:\u003cgit-tag\u003e\n  ```\n\n## CI/CD Workflow\n\nThe GitHub Actions workflow automates:\n\n- **Scheduled Builds:** Regularly triggered container builds keep the environment current.\n- **Container Testing:** Automated health checks and smoke tests verify essential Python libraries (NumPy, Pandas, scikit-learn) import successfully.\n- **Lock File Generation:** The workflow regenerates `pixi.lock` each build, providing a snapshot of installed dependency versions.\n- **Security Scanning:** Utilizes [Trivy](https://github.com/aquasecurity/trivy) to detect vulnerabilities.\n- **Publishing Images:** Automatically tags and publishes container images to GHCR.\n\n## Releases and Changelog\n\nReleases are automatically drafted, and changelogs are generated through [Release Drafter](https://github.com/release-drafter/release-drafter). See the [GitHub Releases](../../releases) page for detailed changelogs and release notes.\n\n## Advanced Usage\n\n### Adding or Removing Packages\n\n1. **Edit `pixi.toml`:** Add new dependencies under `[dependencies]` or `[pypi-dependencies]`.\n2. **Rebuild the Container:**\n   ```bash\n   docker compose build --no-cache\n   docker compose up\n   ```\n3. **Verify:** Ensure the new libraries import correctly (e.g., `import your_package`).\n\n### Changing Python Versions\n\nTo switch Python to another version (e.g., `3.12.*`), edit `pixi.toml`:\n\n```toml\n[dependencies]\npython = \"3.12.*\"\n```\n\nThen rebuild and test as described above.\n\n### Customizing JupyterLab\n\n- **Themes:** Customize themes directly within JupyterLab's settings or by installing compatible theme extensions.\n- **Extensions:** Add extensions to `pixi.toml` (Conda) or `[pypi-dependencies]` (PyPI).\n\n## Troubleshooting\n\n### JupyterLab Not Accessible  \n\n- Check if the container is running:\n  ```bash\n  docker ps\n  ```\n- Inspect container logs for errors:\n  ```bash\n  docker logs \u003ccontainer-name\u003e\n  ```\n\n### Cannot Install a New Package with Pixi  \n\n- Modify `pixi.toml` and rebuild the container as shown in [Advanced Usage](#adding-or-removing-packages).\n- If rebuild fails, manually regenerate `pixi.lock` as described above.\n\n### Slow I/O on macOS  \n\n- Use Docker Desktop file sharing optimizations by adding `:delegated` or `:cached` flags to volume mounts in `docker-compose.yml`:\n  ```yaml\n  volumes:\n    - ~/code:/home/jovyan/work:delegated\n  ```\n\n### Environment Out of Sync  \n\n- Delete the existing `pixi.lock`, then regenerate it:\n  ```bash\n  pixi lock \u0026\u0026 pixi install\n  ```\n\n## Volume Mounts (Customizing Your Environment)\n\nBy default, the provided `docker-compose.yml` mounts common directories (e.g., `~/.ssh`, `~/Downloads`, `~/Documents`, and `~/git`) to match typical workflows. Modify these mounts to fit your specific directory structure or personal workflow preferences.\n\nExample adjustment:\n\n```yaml\nvolumes:\n  - ~/.ssh:/home/jovyan/.ssh\n  - ~/code:/home/jovyan/work:rw\n```\n\nChange these paths as needed for your environment.\n\n## License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdbecker%2Fpixi_jupyter_container","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmdbecker%2Fpixi_jupyter_container","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmdbecker%2Fpixi_jupyter_container/lists"}