Skip to main content
Glama

docker_build

Build Docker images with step-by-step guidance for containerization workflows in development and deployment pipelines.

Instructions

Build a Docker image with guidance

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • The core handler function for the 'docker_build' tool. It validates the image name, checks for a Dockerfile in the specified path, executes the 'docker build' command, and provides user-friendly success or error messages with next steps.
      async ({ image_name, tag, path }) => {
        // Validate image name
        if (!/^[a-z0-9][a-z0-9._-]*$/.test(image_name)) {
          return {
            content: [{
              type: "text",
              text: `Invalid image name: "${image_name}"
    
    Rules:
    - Must be lowercase
    - Must start with letter or number
    - Can contain: a-z, 0-9, ., -, _
    
    Examples: myapp, my-api, company.service`
            }]
          };
        }
    
        // Check Dockerfile exists
        try {
          await access(`${path}/Dockerfile`, constants.F_OK);
        } catch {
          return {
            content: [{
              type: "text",
              text: `No Dockerfile found in ${path}
    
    Use 'docker_analyze_project' tool to generate one.`
            }]
          };
        }
    
        const fullTag = `${image_name}:${tag}`;
        const result = await runCommand(`docker build -t ${fullTag} ${path}`, { timeout: 300000 });
    
        if (!result.success) {
          return {
            content: [{
              type: "text",
              text: `Build failed!\n\nError:\n${result.stderr || result.error}\n\nCommon fixes:\n- Check Dockerfile syntax\n- Ensure base image exists\n- Check file permissions`
            }]
          };
        }
    
        return {
          content: [{
            type: "text",
            text: `Successfully built: ${fullTag}
    
    NEXT STEPS:
    1. Test locally:
       docker run -p 8080:8080 ${fullTag}
    
    2. View running containers:
       docker ps
    
    3. Push to registry:
       - Docker Hub:  docker push ${fullTag}
       - GHCR:        docker tag ${fullTag} ghcr.io/OWNER/${fullTag}
                      docker push ghcr.io/OWNER/${fullTag}`
          }]
        };
      }
  • JSON schema defining the input parameters for the 'docker_build' tool: image_name (required string), tag (string, default 'latest'), path (string, default '.').
    {
      image_name: { type: "string", description: "Name for the image (lowercase)" },
      tag: { type: "string", description: "Image tag", default: "latest" },
      path: { type: "string", description: "Build context path", default: "." }
    },
  • src/index.js:378-449 (registration)
    MCP server registration of the 'docker_build' tool, including name, description, input schema, and handler function reference.
    server.tool(
      "docker_build",
      "Build a Docker image with guidance",
      {
        image_name: { type: "string", description: "Name for the image (lowercase)" },
        tag: { type: "string", description: "Image tag", default: "latest" },
        path: { type: "string", description: "Build context path", default: "." }
      },
      async ({ image_name, tag, path }) => {
        // Validate image name
        if (!/^[a-z0-9][a-z0-9._-]*$/.test(image_name)) {
          return {
            content: [{
              type: "text",
              text: `Invalid image name: "${image_name}"
    
    Rules:
    - Must be lowercase
    - Must start with letter or number
    - Can contain: a-z, 0-9, ., -, _
    
    Examples: myapp, my-api, company.service`
            }]
          };
        }
    
        // Check Dockerfile exists
        try {
          await access(`${path}/Dockerfile`, constants.F_OK);
        } catch {
          return {
            content: [{
              type: "text",
              text: `No Dockerfile found in ${path}
    
    Use 'docker_analyze_project' tool to generate one.`
            }]
          };
        }
    
        const fullTag = `${image_name}:${tag}`;
        const result = await runCommand(`docker build -t ${fullTag} ${path}`, { timeout: 300000 });
    
        if (!result.success) {
          return {
            content: [{
              type: "text",
              text: `Build failed!\n\nError:\n${result.stderr || result.error}\n\nCommon fixes:\n- Check Dockerfile syntax\n- Ensure base image exists\n- Check file permissions`
            }]
          };
        }
    
        return {
          content: [{
            type: "text",
            text: `Successfully built: ${fullTag}
    
    NEXT STEPS:
    1. Test locally:
       docker run -p 8080:8080 ${fullTag}
    
    2. View running containers:
       docker ps
    
    3. Push to registry:
       - Docker Hub:  docker push ${fullTag}
       - GHCR:        docker tag ${fullTag} ghcr.io/OWNER/${fullTag}
                      docker push ghcr.io/OWNER/${fullTag}`
          }]
        };
      }
    );
  • Helper function 'runCommand' used by the docker_build handler to safely execute shell commands like 'docker build', with timeout and error handling.
    async function runCommand(cmd, options = {}) {
      try {
        const { stdout, stderr } = await execAsync(cmd, { timeout: 30000, ...options });
        return { success: true, stdout: stdout.trim(), stderr: stderr.trim() };
      } catch (error) {
        return { success: false, error: error.message, stdout: error.stdout?.trim(), stderr: error.stderr?.trim() };
      }
    }

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