feat: package dockreap as proper Python CLI and update README
- Add pyproject.toml for setuptools-based packaging - Rename entrypoint to dockreap.__main__ and expose console script - Update README with pip/pipx installation instructions - Remove obsolete package-manager references - Add MIRRORS file including PyPI endpoint - Align documentation with actual volume usage detection logic
This commit is contained in:
4
MIRRORS
Normal file
4
MIRRORS
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
git@github.com:kevinveenbirkenbach/dockreap.git
|
||||||
|
ssh://git@code.infinito.nexus:2201/kevinveenbirkenbach/dockreap.git
|
||||||
|
git@github.com:kevinveenbirkenbach/dockreap.git
|
||||||
|
https://pypi.org/project/dockreap/
|
||||||
63
README.md
63
README.md
@@ -1,8 +1,11 @@
|
|||||||
# 🧹 Docker Volume Cleaner
|
# 🧹 Docker Volume Cleaner (dockreap)
|
||||||
[](https://github.com/sponsors/kevinveenbirkenbach) [](https://www.patreon.com/c/kevinveenbirkenbach) [](https://buymeacoffee.com/kevinveenbirkenbach) [](https://s.veen.world/paypaldonate)
|
|
||||||
|
|
||||||
|
[](https://github.com/sponsors/kevinveenbirkenbach)
|
||||||
|
[](https://www.patreon.com/c/kevinveenbirkenbach)
|
||||||
|
[](https://buymeacoffee.com/kevinveenbirkenbach)
|
||||||
|
[](https://s.veen.world/paypaldonate)
|
||||||
|
|
||||||
**Docker Volume Cleaner** is a lightweight Python tool that helps you identify and remove unused anonymous Docker volumes — including symlinks and their targets 🗑️
|
**dockreap** is a lightweight Python CLI tool that helps you identify and remove unused **anonymous Docker volumes** — including symlinks and their targets 🗑️
|
||||||
|
|
||||||
Keep your Docker environment tidy, automated, and efficient 🚀
|
Keep your Docker environment tidy, automated, and efficient 🚀
|
||||||
|
|
||||||
@@ -10,32 +13,43 @@ Keep your Docker environment tidy, automated, and efficient 🚀
|
|||||||
|
|
||||||
## ⚙️ Features
|
## ⚙️ Features
|
||||||
|
|
||||||
- Detects all anonymous Docker volumes (64-character hashes)
|
- Detects anonymous Docker volumes (64-character hash names)
|
||||||
- Skips whitelisted volumes
|
- Skips whitelisted volumes
|
||||||
- Skips bootstrap mounts (`/var/www/bootstrap`)
|
- Skips bootstrap mounts (`/var/www/bootstrap`)
|
||||||
- Cleans up symlinks **and** their target directories
|
- Cleans up symlinks **and** their target directories
|
||||||
- Optional confirmation prompt via `--no-confirmation`
|
- Optional confirmation prompt via `--no-confirmation`
|
||||||
- Pure Python — **no dependencies**
|
- Pure Python — **no external dependencies**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📦 Installation
|
## 📦 Installation
|
||||||
|
|
||||||
Install it using [Kevin’s Package Manager](https://github.com/kevinveenbirkenbach/package-manager) with the alias:
|
### Install from PyPI (recommended)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pkgmgr install dockreap
|
pip install dockreap
|
||||||
```
|
```
|
||||||
|
|
||||||
> `dockreap` is the alias for this tool within `pkgmgr`.
|
or with an isolated environment:
|
||||||
> Repository: [github.com/kevinveenbirkenbach/docker-volume-cleaner](https://github.com/kevinveenbirkenbach/docker-volume-cleaner)
|
|
||||||
|
```bash
|
||||||
|
pipx install dockreap
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install from source (development)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/kevinveenbirkenbach/dockreap.git
|
||||||
|
cd dockreap
|
||||||
|
pip install .
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧪 How to Use
|
## 🧪 Usage
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Basic usage with confirmation prompt
|
# Basic usage (with confirmation prompt)
|
||||||
dockreap
|
dockreap
|
||||||
|
|
||||||
# Skip confirmation
|
# Skip confirmation
|
||||||
@@ -49,9 +63,20 @@ dockreap "volumeid1 volumeid2" --no-confirmation
|
|||||||
```
|
```
|
||||||
|
|
||||||
📝 Notes:
|
📝 Notes:
|
||||||
- Only volumes with 64-character hash names (anonymous volumes) are considered.
|
|
||||||
- Volumes mounted at `/var/www/bootstrap` are automatically excluded.
|
* Only volumes with **64-character hash names** (anonymous volumes) are considered.
|
||||||
- If a volume directory is a **symlink**, both the symlink and its target are removed.
|
* Volumes mounted at `/var/www/bootstrap` are automatically excluded.
|
||||||
|
* If a volume’s `_data` directory is a **symlink**, both the symlink **and its target directory** are removed.
|
||||||
|
* Volumes referenced by **any container (running or stopped)** are not deleted.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔐 Requirements
|
||||||
|
|
||||||
|
* Python ≥ 3.9
|
||||||
|
* Docker CLI available and configured
|
||||||
|
* Sufficient permissions to remove Docker volumes
|
||||||
|
(usually requires `root` or membership in the `docker` group)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -61,13 +86,9 @@ This project is licensed under the **MIT License**.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🤖 Built with ChatGPT
|
|
||||||
|
|
||||||
Developed with the help of [ChatGPT]([https://chat.openai.com/share/7b177eef-b97f-4e63-b2ef-cfdc69c2337e](https://chatgpt.com/share/67f3c910-2ea0-800f-85db-71ec39a713f2)) 🤝
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 👤 Author
|
## 👤 Author
|
||||||
|
|
||||||
**Kevin Veen-Birkenbach**
|
**Kevin Veen-Birkenbach**
|
||||||
🌍 [https://www.veen.world/](https://www.veen.world/)
|
🌍 [https://www.veen.world/](https://www.veen.world/)
|
||||||
|
|
||||||
|
```
|
||||||
|
|||||||
36
pyproject.toml
Normal file
36
pyproject.toml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=69", "wheel"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "dockreap"
|
||||||
|
version = "0.0.0"
|
||||||
|
description = "Remove unused anonymous Docker volumes (with symlink cleanup)."
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.9"
|
||||||
|
license = { text = "MIT" }
|
||||||
|
authors = [{ name = "Kevin Veen-Birkenbach" }]
|
||||||
|
keywords = ["docker", "volumes", "cleanup", "devops"]
|
||||||
|
classifiers = [
|
||||||
|
"License :: OSI Approved :: MIT License",
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
|
"Environment :: Console",
|
||||||
|
"Operating System :: POSIX :: Linux",
|
||||||
|
"Topic :: System :: Systems Administration",
|
||||||
|
]
|
||||||
|
|
||||||
|
dependencies = []
|
||||||
|
|
||||||
|
[project.urls]
|
||||||
|
Homepage = "https://www.veen.world/"
|
||||||
|
Repository = "https://github.com/kevinveenbirkenbach/dockreap"
|
||||||
|
|
||||||
|
[project.scripts]
|
||||||
|
dockreap = "dockreap.__main__:main"
|
||||||
|
|
||||||
|
[tool.setuptools]
|
||||||
|
package-dir = { "" = "src" }
|
||||||
|
|
||||||
|
[tool.setuptools.packages.find]
|
||||||
|
where = ["src"]
|
||||||
0
src/dockreap/__init__.py
Normal file
0
src/dockreap/__init__.py
Normal file
@@ -4,7 +4,6 @@ import argparse
|
|||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
Reference in New Issue
Block a user