| """Task 1: Dockerfile Syntax Errors — EASY. |
| |
| Agent fixes common Dockerfile instruction/syntax mistakes: |
| typos in filenames, invalid base image tags, bad RUN syntax, |
| quoted EXPOSE values, missing FROM instruction. |
| """ |
|
|
|
|
|
|
| from server.models import TaskDifficulty |
| from server.tasks.base import BaseTask |
|
|
|
|
| class DockerfileSyntaxTask(BaseTask): |
| NAME = "Dockerfile Syntax Errors" |
| DESCRIPTION = "Fix syntax and instruction errors in Dockerfiles" |
| DIFFICULTY = TaskDifficulty.EASY |
| AVAILABLE_SECRETS = [] |
|
|
| SCENARIOS = [ |
| |
| { |
| "id": "typo_filename", |
| "files": [ |
| { |
| "path": "Dockerfile", |
| "type": "dockerfile", |
| "content": ( |
| "FROM python:3.9-slim\n" |
| "WORKDIR /app\n" |
| "COPY requirments.txt .\n" |
| "RUN pip install --no-cache-dir -r requirements.txt\n" |
| "COPY . .\n" |
| 'CMD ["python", "app.py"]' |
| ), |
| }, |
| { |
| "path": "requirements.txt", |
| "type": "requirements", |
| "content": "flask==2.0.0\nrequests==2.28.0", |
| }, |
| ], |
| "error": { |
| "phase": "docker_build", |
| "message": "COPY failed: file not found in build context: requirments.txt", |
| "exit_code": 1, |
| "failed_step": "COPY requirments.txt .", |
| "line_hint": 3, |
| }, |
| "expected_fixes": [ |
| { |
| "file": "Dockerfile", |
| "type": "contains", |
| "expected": "COPY requirements.txt", |
| "hint": "Check spelling of the requirements filename — 'requirments' vs 'requirements'", |
| } |
| ], |
| }, |
|
|
| |
| { |
| "id": "invalid_base_image", |
| "files": [ |
| { |
| "path": "Dockerfile", |
| "type": "dockerfile", |
| "content": ( |
| "FROM python:3.9-slimm\n" |
| "WORKDIR /app\n" |
| "COPY requirements.txt .\n" |
| "RUN pip install -r requirements.txt\n" |
| "COPY . .\n" |
| "EXPOSE 7860\n" |
| 'CMD ["python", "app.py"]' |
| ), |
| }, |
| { |
| "path": "requirements.txt", |
| "type": "requirements", |
| "content": "flask==2.0.0", |
| }, |
| ], |
| "error": { |
| "phase": "docker_build", |
| "message": ( |
| "pull access denied for python:3.9-slimm, " |
| "repository does not exist or may require 'docker login'" |
| ), |
| "exit_code": 1, |
| "failed_step": "FROM python:3.9-slimm", |
| "line_hint": 1, |
| }, |
| "expected_fixes": [ |
| { |
| "file": "Dockerfile", |
| "type": "not_contains", |
| "expected": "FROM python:3.9-slimm", |
| "hint": "The base image tag is 'slim', not 'slimm' — remove the extra 'm'", |
| } |
| ], |
| }, |
|
|
| |
| { |
| "id": "invalid_run_syntax", |
| "files": [ |
| { |
| "path": "Dockerfile", |
| "type": "dockerfile", |
| "content": ( |
| "FROM python:3.9\n" |
| "WORKDIR /app\n" |
| "COPY . .\n" |
| "RUN pip install -r requirements.txt\n" |
| " && python setup.py install\n" |
| 'CMD ["python", "main.py"]' |
| ), |
| }, |
| { |
| "path": "requirements.txt", |
| "type": "requirements", |
| "content": "numpy==1.21.0", |
| }, |
| ], |
| "error": { |
| "phase": "docker_build", |
| "message": "Dockerfile parse error: unknown instruction: &&", |
| "exit_code": 1, |
| "line_hint": 5, |
| }, |
| "expected_fixes": [ |
| { |
| "file": "Dockerfile", |
| "type": "contains", |
| "expected": "RUN pip install -r requirements.txt && python setup.py install", |
| "hint": ( |
| "Multi-line RUN commands must use backslash continuation " |
| "(RUN cmd1 \\\\\\n && cmd2) or be written on one line" |
| ), |
| } |
| ], |
| }, |
|
|
| |
| { |
| "id": "copy_missing_source", |
| "files": [ |
| { |
| "path": "Dockerfile", |
| "type": "dockerfile", |
| "content": ( |
| "FROM nginx:alpine\n" |
| "COPY nginx.conf /etc/nginx/nginx.conf\n" |
| "COPY dist/ /usr/share/nginx/html\n" |
| "EXPOSE 80\n" |
| 'CMD ["nginx", "-g", "daemon off;"]' |
| ), |
| }, |
| { |
| "path": "build/index.html", |
| "type": "other", |
| "content": "<!DOCTYPE html><html><body>Hello</body></html>", |
| }, |
| ], |
| "error": { |
| "phase": "docker_build", |
| "message": "COPY failed: file not found in build context: dist/", |
| "exit_code": 1, |
| "failed_step": "COPY dist/ /usr/share/nginx/html", |
| "line_hint": 3, |
| }, |
| "expected_fixes": [ |
| { |
| "file": "Dockerfile", |
| "type": "contains", |
| "expected": "COPY build/", |
| "hint": "The build output is in 'build/' not 'dist/' — check the build context files", |
| } |
| ], |
| }, |
|
|
| |
| { |
| "id": "missing_from_instruction", |
| "files": [ |
| { |
| "path": "Dockerfile", |
| "type": "dockerfile", |
| "content": ( |
| "WORKDIR /app\n" |
| "COPY requirements.txt .\n" |
| "RUN pip install -r requirements.txt\n" |
| "COPY . .\n" |
| 'CMD ["python", "app.py"]' |
| ), |
| }, |
| { |
| "path": "requirements.txt", |
| "type": "requirements", |
| "content": "flask==2.0.0", |
| }, |
| ], |
| "error": { |
| "phase": "docker_build", |
| "message": "Dockerfile parse error: FROM is required as the first instruction", |
| "exit_code": 1, |
| "line_hint": 1, |
| }, |
| "expected_fixes": [ |
| { |
| "file": "Dockerfile", |
| "type": "contains", |
| "expected": "FROM python:", |
| "hint": "Every Dockerfile must start with a FROM instruction", |
| } |
| ], |
| }, |
| ] |
|
|