
Wiremock Standalone Docker
- 2 installs
- 318 repo stars
- Updated June 22, 2026
- giuseppe-trisciuoglio/developer-kit-claude-code
This is a copy of wiremock-standalone-docker by giuseppe-trisciuoglio - installs and ranking accrue to the original listing.
Helps with devops & ci/cd tasks.
About
wiremock-standalone-docker is a Claude Code skill for devops & ci/cd. It helps solo builders move faster with AI-assisted development.
- wiremock-standalone-docker
- DevOps & CI/CD
- AI-coding skill
Wiremock Standalone Docker by the numbers
- 2 all-time installs (skills.sh)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit-claude-code --skill wiremock-standalone-dockerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 318 |
| Last updated | June 22, 2026 |
| Repository | giuseppe-trisciuoglio/developer-kit-claude-code ↗ |
What it does
Helps with devops & ci/cd tasks.
Files
WireMock Standalone Docker Skill
Overview
Provides patterns for running WireMock as a standalone Docker container to mock external APIs during integration and end-to-end testing. Runs WireMock as a separate service that simulates real API behavior for testing HTTP clients, retry logic, and error handling.
When to Use
Use when you need to:
- Mock external APIs during integration or end-to-end testing
- Simulate error conditions (timeouts, 5xx, rate limiting) without real services
- Test HTTP client configurations, retry logic, and error handling
- Create portable, reproducible test environments
- Validate API contracts before implementing the real service
Instructions
Step 1: Set Up Docker Compose
Create a docker-compose.yml with WireMock 3.5.2, port mapping, and volume mounts for mappings and files:
version: "3.8"
services:
wiremock:
image: wiremock/wiremock:3.5.2
ports:
- "8080:8080"
volumes:
- ./wiremock:/home/wiremock
command: ["--global-response-templating"]Step 2: Create Directory Structure
Create the WireMock configuration directories:
wiremock/
├── mappings/ # JSON stub definitions
└── __files/ # Response body filesStep 3: Define API Mappings
Create JSON stub files in wiremock/mappings/ for each scenario:
- Success: Return 200 with JSON body
- Not Found: Return 404
- Server Error: Return 500
- Timeout: Use
fixedDelayMilliseconds - Rate Limit: Return 429 with Retry-After header
Step 4: Start WireMock
docker compose up -dStep 5: Verify WireMock is Running
curl http://localhost:8080/__admin/mappingsExpected: Returns empty array {"mappings":[]} if no stubs loaded, or your stub definitions. If you get connection refused, check that the container is running: docker compose ps
Step 6: Configure HTTP Client
Point your application to http://localhost:8080 (or http://wiremock:8080 in Docker network) instead of the real API.
Step 7: Test Edge Cases
Always test: 200, 400, 401, 403, 404, 429, 500, timeouts, malformed responses.
Examples
Example 1: Mock Successful GET Request
{
"request": { "method": "GET", "url": "/api/users/123" },
"response": {
"status": 200,
"jsonBody": { "id": 123, "name": "Mario Rossi" }
}
}Example 2: Mock Server Error
{
"request": { "method": "GET", "url": "/api/error" },
"response": { "status": 500, "body": "Internal Server Error" }
}Example 3: Mock Timeout
{
"request": { "method": "GET", "url": "/api/slow" },
"response": {
"status": 200,
"fixedDelayMilliseconds": 5000,
"jsonBody": { "message": "delayed" }
}
}Example 4: Docker Compose with Application
services:
wiremock:
image: wiremock/wiremock:3.5.2
ports:
- "8080:8080"
volumes:
- ./wiremock:/home/wiremock
app:
build: .
environment:
- API_BASE_URL=http://wiremock:8080
depends_on:
- wiremockBest Practices
1. Organize mappings by feature: Use subdirectories like users/, products/ 2. Version control mappings: Keep mappings in git for reproducible tests 3. Test all error scenarios: 401, 403, 404, 429, 500, timeouts 4. Reset between test runs: curl -X POST http://localhost:8080/__admin/reset 5. Use descriptive file names: get-user-success.json, post-user-error.json
Constraints and Warnings
- Ensure port 8080 is available or map to a different port
- Configure Docker networking when running multiple containers
- Enable
--global-response-templatingfor dynamic responses - WireMock resets mappings on container restart
Troubleshooting
Requests don't match stubs? Check what WireMock received: curl http://localhost:8080/__admin/requests — shows unmatched requests with details about what was actually sent.
Stub file not loading? Verify file location: place JSON stubs in wiremock/mappings/ and response files in wiremock/__files/. Check file permissions.
Connection refused errors? Run docker compose ps to verify the container is running. Check port conflicts with lsof -i :8080.
References
See references/ for complete examples:
docker-compose.yml- Full Docker Compose configurationwiremock/mappings/- Complete stub examples for all scenarios
version: "3.8"
services:
wiremock:
image: wiremock/wiremock:3.5.2
container_name: wiremock-standalone
ports:
- "8080:8080"
volumes:
- ./wiremock:/home/wiremock
command: ["--global-response-templating"]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/__healthcheck"]
interval: 10s
timeout: 5s
retries: 5
networks:
- wiremock-network
# Example application that uses WireMock
# app:
# build: .
# ports:
# - "8081:8081"
# environment:
# - API_BASE_URL=http://wiremock:8080
# depends_on:
# - wiremock
networks:
wiremock-network:
driver: bridge
{
"request": {
"method": "DELETE",
"url": "/api/users/123"
},
"response": {
"status": 403,
"jsonBody": {
"error": "Forbidden",
"message": "Insufficient permissions to perform this action"
}
}
}
{
"request": {
"method": "GET",
"urlPattern": "/api/users/.*"
},
"response": {
"status": 200,
"jsonBody": {
"id": "{{request.pathSegments.[1]}}",
"timestamp": "{{now}}",
"randomUuid": "{{randomValue}}",
"method": "{{request.method}}"
},
"headers": {
"Content-Type": "application/json",
"X-Request-Id": "{{randomValue}}"
}
}
}
{
"request": {
"method": "GET",
"url": "/api/users/malformed"
},
"response": {
"status": 200,
"body": "{ invalid json"
}
}
{
"request": {
"method": "GET",
"url": "/api/users/rate-limit"
},
"response": {
"status": 429,
"jsonBody": {
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please retry after 60 seconds."
},
"headers": {
"Content-Type": "application/json",
"Retry-After": "60",
"X-RateLimit-Limit": "100",
"X-RateLimit-Remaining": "0"
}
}
}
{
"request": {
"method": "GET",
"url": "/api/protected"
},
"response": {
"status": 401,
"jsonBody": {
"error": "Unauthorized",
"message": "Invalid or missing authentication token"
},
"headers": {
"Content-Type": "application/json",
"WWW-Authenticate": "Bearer realm=\"api\""
}
}
}
{
"request": {
"method": "GET",
"url": "/api/users/error"
},
"response": {
"status": 500,
"body": "Internal Server Error",
"headers": {
"Content-Type": "text/plain"
}
}
}
{
"request": {
"method": "GET",
"url": "/api/users/999"
},
"response": {
"status": 404,
"jsonBody": {
"error": "User not found",
"code": "USER_NOT_FOUND"
},
"headers": {
"Content-Type": "application/json"
}
}
}
{
"request": {
"method": "GET",
"url": "/api/users/slow"
},
"response": {
"status": 200,
"fixedDelayMilliseconds": 5000,
"jsonBody": {
"id": "slow",
"message": "This response was intentionally delayed"
}
}
}
{
"request": {
"method": "GET",
"url": "/api/users/123"
},
"response": {
"status": 200,
"jsonBody": {
"id": 123,
"name": "Mario Rossi",
"email": "mario.rossi@example.com"
},
"headers": {
"Content-Type": "application/json"
}
}
}