Add Home
commit
11fa7168ed
1 changed files with 126 additions and 0 deletions
126
Home.md
Normal file
126
Home.md
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
# Tux-Dock Wiki
|
||||||
|
|
||||||
|
## 1. Project Overview
|
||||||
|
Tux-Dock is a single-binary C++17 console application that wraps common Docker workflows in an interactive menu.
|
||||||
|
It serves as a lightweight abstraction layer that helps teams evolve “pet” containers into repeatable “cattle”
|
||||||
|
infrastructure: every ad-hoc shell action becomes a codified routine, nudging workflows toward production-grade
|
||||||
|
discipline. All menu actions shell out to the locally installed Docker Engine, so the tool behaves as a convenience
|
||||||
|
layer rather than a Docker API client.
|
||||||
|
|
||||||
|
## 2. Architecture & Design
|
||||||
|
- **Entry Point**: `main()` hosts an infinite menu loop and dispatches selections to `DockerManager`.
|
||||||
|
- **Core Class**: `DockerManager` encapsulates all Docker-facing routines. Each public method corresponds to a menu
|
||||||
|
option, keeping the CLI and behaviour in sync.
|
||||||
|
- **Command Execution**: All Docker calls are performed via `system()` or `popen()`. There is no additional parsing or
|
||||||
|
command templating layer.
|
||||||
|
- **State Handling**: The program remains stateless between operations. Container discovery is performed on demand
|
||||||
|
(`docker ps -a`) to keep menu choices current.
|
||||||
|
- **Filesystem Helpers**: The Dockerfile-generation feature relies on `<filesystem>` and `<fstream>` to vet script
|
||||||
|
paths and stream file contents.
|
||||||
|
|
||||||
|
## 3. Build & Installation
|
||||||
|
| Step | Command | Notes |
|
||||||
|
| ---- | ------- | ----- |
|
||||||
|
| Compile | `./compile.sh` | Wraps `g++ -std=c++17 main.cpp -o tux-dock`. |
|
||||||
|
| Manual build | `g++ -std=c++17 main.cpp -o tux-dock` | Requires C++17-capable compiler. |
|
||||||
|
| Run | `sudo ./tux-dock` | Needs Docker privileges; add your user to the `docker` group to avoid `sudo`. |
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
- Docker Engine (tested on Debian 12/13, Alpine, Arch).
|
||||||
|
- Standard C++17 library (no third-party dependencies).
|
||||||
|
|
||||||
|
## 4. Menu Map
|
||||||
|
| Option | Description | Invoked Method |
|
||||||
|
| ------ | ----------- | -------------- |
|
||||||
|
| 1 | Pull an image by name/tag. | `DockerManager::pullImage` |
|
||||||
|
| 2 | Run/create interactive container with optional port mappings. | `runContainerInteractive` |
|
||||||
|
| 3 | List all containers (including stopped). | `listContainers` |
|
||||||
|
| 4 | List all local images. | `listImages` |
|
||||||
|
| 5 | Start a container and attach (`docker start -ai`). | `startInteractive` |
|
||||||
|
| 6 | Start a container in detached mode. | `startDetached` |
|
||||||
|
| 7 | Delete an image (`docker rmi`). | `deleteImage` |
|
||||||
|
| 8 | Stop a running container. | `stopContainer` |
|
||||||
|
| 9 | Remove a stopped container. | `removeContainer` |
|
||||||
|
| 10 | Attach an interactive shell to a running container. | `execShell` |
|
||||||
|
| 11 | Execute a command in detached mode. | `execDetachedCommand` |
|
||||||
|
| 12 | Launch a MySQL container with configurable port, password, version. | `spinUpMySQL` |
|
||||||
|
| 13 | Display the IP address of a container. | `showContainerIP` |
|
||||||
|
| 14 | Convert a bash script into a Dockerfile and optionally build an image. | `createDockerfile` |
|
||||||
|
| 15 | Exit the program. | — |
|
||||||
|
|
||||||
|
## 5. Key Workflows
|
||||||
|
|
||||||
|
### 5.1 Container Selection
|
||||||
|
- The helper `selectContainer()` lists containers with a numbering scheme derived from `docker ps -a --format '{{.ID}}
|
||||||
|
{{.Names}}'`.
|
||||||
|
- Users choose by number; the function returns the full container ID for downstream commands.
|
||||||
|
- Invalid selections or empty lists short-circuit the requested action.
|
||||||
|
|
||||||
|
### 5.2 Running Containers
|
||||||
|
- Option 2 prompts for an image, desired port mappings, and explains the `-p` syntax before calling `docker run -it
|
||||||
|
<ports> <image> /bin/sh`.
|
||||||
|
- The shell defaults to `/bin/sh`. If the image lacks `/bin/sh`, the command will fail—users should supply images
|
||||||
|
accordingly.
|
||||||
|
|
||||||
|
### 5.3 Detached Commands
|
||||||
|
- Option 11 accepts a free-form command via `getline`. Quotes (`"`) and backslashes (`\`) are escaped before
|
||||||
|
constructing `docker exec -d`.
|
||||||
|
- Whitespace and other shell-sensitive characters are passed through, so complex commands might require additional
|
||||||
|
manual quoting.
|
||||||
|
|
||||||
|
### 5.4 MySQL Bootstrap
|
||||||
|
- Option 12 wraps `docker run -d mysql:<tag>` with required environment variables and port mapping.
|
||||||
|
- The container name defaults to `mysql-container`; repeated runs must stop/remove the existing container first or be
|
||||||
|
renamed manually.
|
||||||
|
|
||||||
|
### 5.5 Dockerfile Generator
|
||||||
|
- Reads a bash script line by line, skipping empty lines and comments.
|
||||||
|
- Outputs a Dockerfile with a `FROM` line, sets `/app` as `WORKDIR`, and converts each remaining line into a `RUN`
|
||||||
|
directive.
|
||||||
|
- Appends `CMD ["/bin/bash"]` to keep the container interactive by default.
|
||||||
|
- Optionally builds an image immediately (`docker build -t <name> -f <outfile> .`).
|
||||||
|
|
||||||
|
## 6. Extending Tux-Dock
|
||||||
|
|
||||||
|
1. **Add a Menu Entry**: Insert a new case in the `switch` statement and expose a corresponding public method on
|
||||||
|
`DockerManager`.
|
||||||
|
2. **Implement Docker Logic**: Follow existing patterns—call `runCommand()` for straightforward shell commands or
|
||||||
|
`popen()` if output must be parsed.
|
||||||
|
3. **User Prompts**: Prefer structured prompts (`cin >> value`) for simple inputs; switch to `getline()` when spaces
|
||||||
|
are expected (remember to flush `cin` beforehand).
|
||||||
|
4. **Validation**: Add additional validation or confirmation where commands could be destructive (e.g., bulk removes,
|
||||||
|
pruning).
|
||||||
|
5. **Documentation**: Update this wiki and the README with new functionality and edge cases.
|
||||||
|
|
||||||
|
Suggested enhancements:
|
||||||
|
- Add `docker logs`, `docker stats`, and image pruning commands.
|
||||||
|
- Swap `system()` for `std::system` alternatives or libdocker bindings if stronger security or portability is
|
||||||
|
required.
|
||||||
|
- Introduce configuration files for default images, port mappings, and container names.
|
||||||
|
|
||||||
|
## 7. Security & Operational Considerations
|
||||||
|
- **Input Sanitisation**: User inputs feed directly into shell commands. Avoid untrusted usage or wrap commands with
|
||||||
|
additional validation when integrating into shared environments.
|
||||||
|
- **Shell Assumptions**: Hard-coded `/bin/sh` may fail on minimal images (e.g., Scratch). Allow configurable shells
|
||||||
|
for broader compatibility.
|
||||||
|
- **Error Handling**: Most commands simply echo Docker output. Enhance detection for non-zero exit codes to deliver
|
||||||
|
clearer feedback.
|
||||||
|
- **Permissions**: Docker commands require either root privileges or membership in the `docker` group. Documented in
|
||||||
|
README and reiterated here.
|
||||||
|
- **Log Handling**: The app prints Docker CLI output to stdout; there is no logging subsystem.
|
||||||
|
|
||||||
|
## 8. Troubleshooting
|
||||||
|
| Symptom | Likely Cause | Mitigation |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| “command not found” | Docker CLI missing or not in PATH. | Install Docker or ensure the binary is accessible. |
|
||||||
|
| Menu inputs skipped | Mixing `cin >>` and `getline` without flushing. | Already handled before `getline`, but ensure
|
||||||
|
custom additions call `cin.ignore()` appropriately. |
|
||||||
|
| MySQL launch fails | Existing container named `mysql-container`, wrong port, or incompatible tag. | Remove/rename
|
||||||
|
conflicting containers; verify credentials. |
|
||||||
|
| Dockerfile build errors | Bash script contains multi-line constructs or unsupported commands. | Refine script or
|
||||||
|
manually edit generated Dockerfile. |
|
||||||
|
|
||||||
|
## 9. Related Assets
|
||||||
|
- `compile.sh`: Convenience build script for the binary.
|
||||||
|
- `option13_script.sh`: Example bash script suitable for the Dockerfile generator demo.
|
||||||
|
- README: Marketing-ready overview; keep wiki and README aligned to avoid drift.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue