text
╔═══════════════════════════════════════════════════════════╗
║ ║
║ 🐳 P O R T A I N E R C O N T R O L C L I 🐳 ║
║ ║
║ Manage Docker containers via Portainer API ║
║ Start, stop, deploy, redeploy ║
║ ║
╚═══════════════════════════════════════════════════════════╝
"Docker containers? I'll handle them from my lily pad." 🐸
The Portainer Skill gives you control over your Docker infrastructure through Portainer's REST API. Manage containers, stacks, and deployments without touching the web UI.
Features:
WhatDetailsPortainerVersion 2.x with API accessToolscurl, jqAuthAPI Access Token
Get API Token from Portainer:
Configure credentials: bash
# Add to ~/.clawdbot/.env
PORTAINER_URL=https://your-portainer-server:9443
PORTAINER_API_KEY=ptr_your_token_here
Ready! 🚀
status — Check Portainer Server#bash
./portainer.sh status
Output:
text
Portainer v2.27.3
endpoints — List Environments#bash
./portainer.sh endpoints
Output:
text
3: portainer (local) - ✓ online
4: production (remote) - ✓ online
containers — List Containers#bash
# List containers on default endpoint (4)
./portainer.sh containers
# List containers on specific endpoint
./portainer.sh containers 3
Output:
text
steinbergerraum-web-1 running Up 2 days
cora-web-1 running Up 6 weeks
minecraft running Up 6 weeks (healthy)
stacks — List All Stacks#bash
./portainer.sh stacks
Output:
text
25: steinbergerraum - ✓ active
33: cora - ✓ active
35: minecraft - ✓ active
4: pulse-website - ✗ inactive
stack-info — Stack Details#bash
./portainer.sh stack-info 25
Output:
json
{
"Id": 25,
"Name": "steinbergerraum",
"Status": 1,
"EndpointId": 4,
"GitConfig": "https://github.com/user/repo",
"UpdateDate": "2026-01-25T08:44:56Z"
}
redeploy — Pull & Redeploy Stack 🔄#bash
./portainer.sh redeploy 25
Output:
text
✓ Stack 'steinbergerraum' redeployed successfully
This will:
start / stop / restart — Container Control#bash
# Start a container
./portainer.sh start steinbergerraum-web-1
# Stop a container
./portainer.sh stop steinbergerraum-web-1
# Restart a container
./portainer.sh restart steinbergerraum-web-1
# Specify endpoint (default: 4)
./portainer.sh restart steinbergerraum-web-1 4
Output:
text
✓ Container 'steinbergerraum-web-1' restarted
logs — View Container Logs#bash
# Last 100 lines (default)
./portainer.sh logs steinbergerraum-web-1
# Last 50 lines
./portainer.sh logs steinbergerraum-web-1 4 50
bash
# After merging PR
./portainer.sh redeploy 25
./portainer.sh logs steinbergerraum-web-1 4 20
bash
./portainer.sh containers
./portainer.sh logs cora-web-1
./portainer.sh restart cora-web-1
bash
./portainer.sh status
./portainer.sh endpoints
./portainer.sh containers
./portainer.sh stacks
Problem: Stack redeploy fails with git auth error
Solution: The stack needs repositoryGitCredentialID parameter. The script handles this automatically by reading from the existing stack config.
Problem: Container name doesn't match
Solution: Use exact name from ./portainer.sh containers:
steinbergerraum-web-1 not steinbergerraumProblem: Credentials not configured
Solution:
bash
# Add to ~/.clawdbot/.env
echo "PORTAINER_URL=https://your-server:9443" >> ~/.clawdbot/.env
echo "PORTAINER_API_KEY=ptr_your_token" >> ~/.clawdbot/.env
text
"Redeploy the website"
→ ./portainer.sh redeploy 25
"Show me running containers"
→ ./portainer.sh containers
"Restart the Minecraft server"
→ ./portainer.sh restart minecraft
"What stacks do we have?"
→ ./portainer.sh stacks
VersionDateChanges1.0.02026-01-25Initial release
text
@..@
(----)
( >__< ) "Containers are just fancy lily pads
^^ ^^ for your code to hop around!"
Author: Andy Steinberger (with help from his Clawdbot Owen the Frog 🐸)
Powered by: Portainer API
Part of: Clawdbot Skills Collection
Made with 💚 for the Clawdbot Community
Ribbit! 🐸