Compare commits
No commits in common. "a1550d02faeef382b21915ab3dfd70fae46e7b58" and "a7151b35392aba986024c09e5bcc2995cabac660" have entirely different histories.
a1550d02fa
...
a7151b3539
4 changed files with 12 additions and 93 deletions
|
|
@ -1,45 +0,0 @@
|
||||||
name: Build & Upload tux-dock
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- dev
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: [self-hosted]
|
|
||||||
env:
|
|
||||||
BRANCH: ${{ github.ref_name }}
|
|
||||||
COMMIT: ${{ github.sha }}
|
|
||||||
steps:
|
|
||||||
- name: Clone current branch
|
|
||||||
run: |
|
|
||||||
git clone --branch "$BRANCH" https://mentalnet.xyz/forgejo/markmental/tuxdock.git .
|
|
||||||
echo "✅ Checked out branch $BRANCH ($COMMIT)"
|
|
||||||
|
|
||||||
- name: Compile tux-dock
|
|
||||||
run: |
|
|
||||||
g++ -std=c++17 main.cpp -o tux-dock
|
|
||||||
chmod +x tux-dock
|
|
||||||
echo "🎉 tux-dock compiled and marked executable!"
|
|
||||||
|
|
||||||
- name: Verify build
|
|
||||||
run: file tux-dock
|
|
||||||
|
|
||||||
- name: Prepare build artifact (tar.gz)
|
|
||||||
run: |
|
|
||||||
mkdir -p build/"$BRANCH"
|
|
||||||
mv tux-dock build/"$BRANCH"/
|
|
||||||
SHORT_HASH=$(echo "$COMMIT" | cut -c1-7)
|
|
||||||
TAR_NAME="tux-dock-linux-x86_64-${BRANCH}-${SHORT_HASH}.tar.gz"
|
|
||||||
tar czf "$TAR_NAME" -C build "$BRANCH"
|
|
||||||
echo "📦 Created $TAR_NAME"
|
|
||||||
|
|
||||||
- name: Upload build artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: tux-dock-linux-x86_64-${{ env.BRANCH }}-${{ env.COMMIT }}
|
|
||||||
path: tux-dock-linux-x86_64-${{ env.BRANCH }}-*.tar.gz
|
|
||||||
|
|
||||||
|
|
||||||
11
README.md
11
README.md
|
|
@ -14,7 +14,6 @@ It offers a clean, interactive menu for common Docker operations like pulling im
|
||||||
- 🔹 **Script-to-image workflow** — turn a bash setup script into a Dockerfile and build the resulting image in one go.
|
- 🔹 **Script-to-image workflow** — turn a bash setup script into a Dockerfile and build the resulting image in one go.
|
||||||
- 🔹 **Quick MySQL setup** — spin up a MySQL container with version, password, and port configuration in seconds.
|
- 🔹 **Quick MySQL setup** — spin up a MySQL container with version, password, and port configuration in seconds.
|
||||||
- 🔹 **Get container IP address** — cleanly retrieves and displays only the container’s assigned IP.
|
- 🔹 **Get container IP address** — cleanly retrieves and displays only the container’s assigned IP.
|
||||||
- 🔹 **Run detached commands** — execute background jobs inside a container without attaching an interactive shell.
|
|
||||||
- 🔹 **Modern C++ design** — built with classes, minimal dependencies, and clear abstractions.
|
- 🔹 **Modern C++ design** — built with classes, minimal dependencies, and clear abstractions.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -59,11 +58,10 @@ Tux-Dock: Docker Management Menu
|
||||||
8. Stop Container
|
8. Stop Container
|
||||||
9. Remove Container
|
9. Remove Container
|
||||||
10. Attach Shell to Running Container
|
10. Attach Shell to Running Container
|
||||||
11. Run Detached Command in Container
|
11. Spin Up MySQL Container
|
||||||
12. Spin Up MySQL Container
|
12. Get Container IP Address
|
||||||
13. Get Container IP Address
|
13. Create Dockerfile & Build Image from Bash Script
|
||||||
14. Create Dockerfile & Build Image from Bash Script
|
14. Exit
|
||||||
15. Exit
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Each action guides you through the required steps.
|
Each action guides you through the required steps.
|
||||||
|
|
@ -94,7 +92,6 @@ class DockerManager {
|
||||||
void runContainerInteractive();
|
void runContainerInteractive();
|
||||||
void listContainers() const;
|
void listContainers() const;
|
||||||
void startInteractive();
|
void startInteractive();
|
||||||
void execDetachedCommand();
|
|
||||||
void stopContainer();
|
void stopContainer();
|
||||||
void showContainerIP();
|
void showContainerIP();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
49
main.cpp
49
main.cpp
|
|
@ -6,7 +6,6 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -22,7 +21,6 @@ public:
|
||||||
void stopContainer();
|
void stopContainer();
|
||||||
void removeContainer();
|
void removeContainer();
|
||||||
void execShell();
|
void execShell();
|
||||||
void execDetachedCommand();
|
|
||||||
void createDockerfile();
|
void createDockerfile();
|
||||||
void spinUpMySQL();
|
void spinUpMySQL();
|
||||||
void showContainerIP();
|
void showContainerIP();
|
||||||
|
|
@ -155,35 +153,6 @@ void DockerManager::execShell() {
|
||||||
if (!id.empty()) runCommand("docker exec -it " + id + " /bin/sh");
|
if (!id.empty()) runCommand("docker exec -it " + id + " /bin/sh");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DockerManager::execDetachedCommand() {
|
|
||||||
string id = selectContainer("Select container to run command in (detached)");
|
|
||||||
if (id.empty()) return;
|
|
||||||
|
|
||||||
// Flush any leftover newline before using getline
|
|
||||||
cin.ignore(numeric_limits<streamsize>::max(), '\n');
|
|
||||||
|
|
||||||
string command;
|
|
||||||
cout << "Enter command to execute inside the container: ";
|
|
||||||
getline(cin, command);
|
|
||||||
|
|
||||||
if (command.empty()) {
|
|
||||||
cout << "No command entered. Aborting.\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
string escapedCommand;
|
|
||||||
escapedCommand.reserve(command.size() * 2);
|
|
||||||
for (char c : command) {
|
|
||||||
if (c == '"' || c == '\\')
|
|
||||||
escapedCommand += '\\';
|
|
||||||
escapedCommand += c;
|
|
||||||
}
|
|
||||||
|
|
||||||
cout << "Executing command in detached mode...\n";
|
|
||||||
runCommand("docker exec -d " + id + " /bin/sh -c \"" + escapedCommand + "\"");
|
|
||||||
cout << "Command dispatched.\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
void DockerManager::spinUpMySQL() {
|
void DockerManager::spinUpMySQL() {
|
||||||
string port, password, version;
|
string port, password, version;
|
||||||
cout << "Enter port mapping (e.g., 3306:3306): ";
|
cout << "Enter port mapping (e.g., 3306:3306): ";
|
||||||
|
|
@ -306,11 +275,10 @@ int main() {
|
||||||
<< "8. Stop Container\n"
|
<< "8. Stop Container\n"
|
||||||
<< "9. Remove Container\n"
|
<< "9. Remove Container\n"
|
||||||
<< "10. Attach Shell to Running Container\n"
|
<< "10. Attach Shell to Running Container\n"
|
||||||
<< "11. Run Detached Command in Container\n"
|
<< "11. Spin Up MySQL Container\n"
|
||||||
<< "12. Spin Up MySQL Container\n"
|
<< "12. Get Container IP Address\n"
|
||||||
<< "13. Get Container IP Address\n"
|
<< "13. Create Dockerfile & Build Image from Bash Script\n"
|
||||||
<< "14. Create Dockerfile & Build Image from Bash Script\n"
|
<< "14. Exit\n"
|
||||||
<< "15. Exit\n"
|
|
||||||
<< "----------------------------------\n"
|
<< "----------------------------------\n"
|
||||||
<< "Choose an option: ";
|
<< "Choose an option: ";
|
||||||
|
|
||||||
|
|
@ -327,11 +295,10 @@ int main() {
|
||||||
case 8: docker.stopContainer(); break;
|
case 8: docker.stopContainer(); break;
|
||||||
case 9: docker.removeContainer(); break;
|
case 9: docker.removeContainer(); break;
|
||||||
case 10: docker.execShell(); break;
|
case 10: docker.execShell(); break;
|
||||||
case 11: docker.execDetachedCommand(); break;
|
case 11: docker.spinUpMySQL(); break;
|
||||||
case 12: docker.spinUpMySQL(); break;
|
case 12: docker.showContainerIP(); break;
|
||||||
case 13: docker.showContainerIP(); break;
|
case 13: docker.createDockerfile(); break;
|
||||||
case 14: docker.createDockerfile(); break;
|
case 14:
|
||||||
case 15:
|
|
||||||
cout << "Exiting Tux-Dock.\n";
|
cout << "Exiting Tux-Dock.\n";
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
BIN
tux-dock
Executable file
BIN
tux-dock
Executable file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue