Skip to main content
Glama

docker_analyze_project

Analyze your project structure to generate Dockerfile recommendations for containerization, helping streamline DevOps workflows.

Instructions

Analyze project and suggest Dockerfile

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • src/index.js:199-376 (registration)
    MCP server.tool registration for the 'docker_analyze_project' tool. Includes tool description, input schema (path parameter), and the complete async handler function that detects project type by checking for specific files (pom.xml, package.json, etc.) and generates a recommended multi-stage Dockerfile and .dockerignore based on the detected type (java-maven, nodejs, python, etc.). Returns formatted text with the recommendations.
    server.tool( "docker_analyze_project", "Analyze project and suggest Dockerfile", { path: { type: "string", description: "Project path", default: "." } }, async ({ path }) => { const projectPath = path || "."; let projectType = "unknown"; let dockerfile = ""; let dockerignore = ""; // Detect project type const checks = [ { file: "pom.xml", type: "java-maven" }, { file: "build.gradle", type: "java-gradle" }, { file: "package.json", type: "nodejs" }, { file: "requirements.txt", type: "python" }, { file: "go.mod", type: "golang" }, { file: "Cargo.toml", type: "rust" }, ]; for (const check of checks) { try { await access(`${projectPath}/${check.file}`, constants.F_OK); projectType = check.type; break; } catch {} } // Generate Dockerfile based on project type const dockerfiles = { "java-maven": `# Build stage FROM maven:3.9-eclipse-temurin-17 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # Runtime stage FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]`, "java-gradle": `# Build stage FROM gradle:8-jdk17 AS build WORKDIR /app COPY build.gradle settings.gradle ./ COPY gradle ./gradle RUN gradle dependencies --no-daemon COPY src ./src RUN gradle build -x test --no-daemon # Runtime stage FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]`, "nodejs": `FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "index.js"]`, "python": `FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "app.py"]`, "golang": `# Build stage FROM golang:1.21-alpine AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o main . # Runtime stage FROM alpine:latest WORKDIR /app COPY --from=build /app/main . EXPOSE 8080 CMD ["./main"]`, "rust": `# Build stage FROM rust:1.75 AS build WORKDIR /app COPY Cargo.toml Cargo.lock ./ COPY src ./src RUN cargo build --release # Runtime stage FROM debian:bookworm-slim COPY --from=build /app/target/release/app /usr/local/bin/ EXPOSE 8080 CMD ["app"]`, "unknown": `# Could not detect project type # Please specify your base image and build steps FROM ubuntu:22.04 WORKDIR /app COPY . . # Add your build and run commands here` }; const dockerignores = { "java-maven": `target/ *.class *.jar *.log .git/ .idea/ *.iml`, "java-gradle": `build/ .gradle/ *.class *.jar *.log .git/ .idea/ *.iml`, "nodejs": `node_modules/ npm-debug.log .git/ .env coverage/ dist/`, "python": `__pycache__/ *.pyc .git/ .env venv/ .venv/`, "golang": `.git/ *.exe *.test *.out`, "rust": `target/ .git/ Cargo.lock`, "unknown": `.git/ *.log .env` }; dockerfile = dockerfiles[projectType]; dockerignore = dockerignores[projectType]; return { content: [{ type: "text", text: `PROJECT TYPE DETECTED: ${projectType} RECOMMENDED DOCKERFILE: ======================= ${dockerfile} RECOMMENDED .dockerignore: ========================== ${dockerignore} NEXT STEPS: 1. Save Dockerfile: Copy the above to ./Dockerfile 2. Save .dockerignore: Copy the above to ./.dockerignore 3. Build image: docker build -t myapp:latest . 4. Run container: docker run -p 8080:8080 myapp:latest` }] }; } );
  • Input schema definition for the tool: optional 'path' string parameter defaulting to current directory.
    { path: { type: "string", description: "Project path", default: "." } },
  • The core handler function that implements the tool logic: detects project type, generates appropriate Dockerfile and .dockerignore, and returns them in a markdown-formatted response.
    async ({ path }) => { const projectPath = path || "."; let projectType = "unknown"; let dockerfile = ""; let dockerignore = ""; // Detect project type const checks = [ { file: "pom.xml", type: "java-maven" }, { file: "build.gradle", type: "java-gradle" }, { file: "package.json", type: "nodejs" }, { file: "requirements.txt", type: "python" }, { file: "go.mod", type: "golang" }, { file: "Cargo.toml", type: "rust" }, ]; for (const check of checks) { try { await access(`${projectPath}/${check.file}`, constants.F_OK); projectType = check.type; break; } catch {} } // Generate Dockerfile based on project type const dockerfiles = { "java-maven": `# Build stage FROM maven:3.9-eclipse-temurin-17 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # Runtime stage FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]`, "java-gradle": `# Build stage FROM gradle:8-jdk17 AS build WORKDIR /app COPY build.gradle settings.gradle ./ COPY gradle ./gradle RUN gradle dependencies --no-daemon COPY src ./src RUN gradle build -x test --no-daemon # Runtime stage FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]`, "nodejs": `FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "index.js"]`, "python": `FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "app.py"]`, "golang": `# Build stage FROM golang:1.21-alpine AS build WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o main . # Runtime stage FROM alpine:latest WORKDIR /app COPY --from=build /app/main . EXPOSE 8080 CMD ["./main"]`, "rust": `# Build stage FROM rust:1.75 AS build WORKDIR /app COPY Cargo.toml Cargo.lock ./ COPY src ./src RUN cargo build --release # Runtime stage FROM debian:bookworm-slim COPY --from=build /app/target/release/app /usr/local/bin/ EXPOSE 8080 CMD ["app"]`, "unknown": `# Could not detect project type # Please specify your base image and build steps FROM ubuntu:22.04 WORKDIR /app COPY . . # Add your build and run commands here` }; const dockerignores = { "java-maven": `target/ *.class *.jar *.log .git/ .idea/ *.iml`, "java-gradle": `build/ .gradle/ *.class *.jar *.log .git/ .idea/ *.iml`, "nodejs": `node_modules/ npm-debug.log .git/ .env coverage/ dist/`, "python": `__pycache__/ *.pyc .git/ .env venv/ .venv/`, "golang": `.git/ *.exe *.test *.out`, "rust": `target/ .git/ Cargo.lock`, "unknown": `.git/ *.log .env` }; dockerfile = dockerfiles[projectType]; dockerignore = dockerignores[projectType]; return { content: [{ type: "text", text: `PROJECT TYPE DETECTED: ${projectType} RECOMMENDED DOCKERFILE: ======================= ${dockerfile} RECOMMENDED .dockerignore: ========================== ${dockerignore} NEXT STEPS: 1. Save Dockerfile: Copy the above to ./Dockerfile 2. Save .dockerignore: Copy the above to ./.dockerignore 3. Build image: docker build -t myapp:latest . 4. Run container: docker run -p 8080:8080 myapp:latest` }] }; }
  • Alternative/exported version of the handler function (for testing), with similar project detection but simpler single-stage Dockerfiles.
    export async function dockerAnalyzeProject({ path }) { const projectPath = path || "."; let projectType = "unknown"; const checks = [ { file: "pom.xml", type: "java-maven" }, { file: "build.gradle", type: "java-gradle" }, { file: "package.json", type: "nodejs" }, { file: "requirements.txt", type: "python" }, { file: "go.mod", type: "golang" }, { file: "Cargo.toml", type: "rust" }, ]; for (const check of checks) { try { await access(`${projectPath}/${check.file}`, constants.F_OK); projectType = check.type; break; } catch {} } const dockerfiles = { "java-maven": `FROM maven:3.9-eclipse-temurin-17 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]`, "nodejs": `FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "index.js"]`, "python": `FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "app.py"]`, "unknown": `# Could not detect project type FROM ubuntu:22.04 WORKDIR /app COPY . .` }; const dockerfile = dockerfiles[projectType] || dockerfiles["unknown"]; return { content: [{ type: "text", text: `PROJECT TYPE DETECTED: ${projectType}\n\nRECOMMENDED DOCKERFILE:\n=======================\n${dockerfile}` }] }; }
  • src/tools.js:576-597 (registration)
    Exports a 'tools' object containing dockerAnalyzeProject for potential use in testing or other non-MCP contexts.
    export const tools = { // Git gitStatusExplained, gitBranchExplained, gitCommitGuided, // Docker dockerCheckSetup, dockerAnalyzeProject, dockerBuild, // GitHub githubSecretsList, githubSecretsSet, // Azure azureCheckCli, azureAcrSetup, azureContainerAppsDeploy, // SonarCloud sonarcloudSetupGuide, sonarcloudCreateConfig, // Onboarding devOnboardingCheck, };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rideRTD/RTD-DevOps'

If you have feedback or need assistance with the MCP directory API, please join our Discord server