diff --git "a/data/sabnock_docker_v1.json" "b/data/sabnock_docker_v1.json"
new file mode 100644--- /dev/null
+++ "b/data/sabnock_docker_v1.json"
@@ -0,0 +1,8139 @@
+[
+ {
+ "id": "sbd-0001",
+ "title": "Python image forgets requirements.txt",
+ "summary": "The Dockerfile installs from requirements.txt before that file exists inside the build context layer.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "build-context",
+ "pip"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY app.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"app.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "flask==3.0.3"
+ ]
+ },
+ {
+ "path": "app.py",
+ "content": [
+ "from flask import Flask",
+ "",
+ "app = Flask(__name__)",
+ "",
+ "@app.get(\"/\")",
+ "def home():",
+ " return {\"status\": \"ok\"}",
+ "",
+ "if __name__ == \"__main__\":",
+ " app.run(host=\"0.0.0.0\", port=8080)"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Step 4/5 : RUN pip install --no-cache-dir -r requirements.txt",
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0001 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0001 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "-COPY app.py .",
+ "+COPY requirements.txt .",
+ " RUN pip install --no-cache-dir -r requirements.txt",
+ "+COPY app.py .",
+ " CMD [\"python\", \"app.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0002",
+ "title": "Node image uses npm ci without a lockfile",
+ "summary": "The project has only package.json, but the Dockerfile uses npm ci, which requires a package-lock.json or npm-shrinkwrap.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY index.js .",
+ "CMD [\"node\", \"index.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node index.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "index.js",
+ "content": [
+ "const express = require('express');",
+ "const app = express();",
+ "app.get('/', (_req, res) => res.json({status: 'ok'}));",
+ "app.listen(3000, '0.0.0.0');"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! code EUSAGE",
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0002 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0002 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY index.js .",
+ " CMD [\"node\", \"index.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0003",
+ "title": "Go multi-stage build copies the wrong binary",
+ "summary": "The builder stage writes /out/server, but the runtime stage tries to copy and execute /out/api.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "copy"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod ./",
+ "COPY main.go ./",
+ "RUN go build -o /out/server ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/api /usr/local/bin/api",
+ "CMD [\"api\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd0003",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "import \"fmt\"",
+ "",
+ "func main() {",
+ " fmt.Println(\"ok\")",
+ "}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to solve: failed to compute cache key: failed to calculate checksum of ref: \"/out/api\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0003 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0003 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,6 +3,6 @@",
+ " COPY go.mod ./",
+ " COPY main.go ./",
+ " RUN go build -o /out/server ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/api /usr/local/bin/api",
+ "-CMD [\"api\"]",
+ "+COPY --from=build /out/server /usr/local/bin/server",
+ "+CMD [\"server\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/server /usr/local/bin/server"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"server\"]"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0004",
+ "title": "Compose API starts before Postgres is ready",
+ "summary": "depends_on only controls startup order. The API starts while Postgres is still initializing, so integration tests see connection refused.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "postgres",
+ "healthcheck",
+ "integration-test"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " environment:",
+ " DATABASE_URL: postgres://postgres:postgres@db:5432/postgres",
+ " depends_on:",
+ " - db",
+ " db:",
+ " image: postgres:16-alpine",
+ " environment:",
+ " POSTGRES_PASSWORD: postgres"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY app.py .",
+ "CMD [\"python\", \"app.py\"]"
+ ]
+ },
+ {
+ "path": "app.py",
+ "content": [
+ "import os",
+ "print(os.environ['DATABASE_URL'])"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | psycopg.OperationalError: connection failed: Connection refused",
+ "db-1 | database system is ready to accept connections"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/docker-compose.yml b/docker-compose.yml",
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -1,11 +1,16 @@",
+ " services:",
+ " api:",
+ " build: .",
+ " environment:",
+ " DATABASE_URL: postgres://postgres:postgres@db:5432/postgres",
+ " depends_on:",
+ "- - db",
+ "+ db:",
+ "+ condition: service_healthy",
+ " db:",
+ " image: postgres:16-alpine",
+ " environment:",
+ " POSTGRES_PASSWORD: postgres",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "pg_isready -U postgres"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0005",
+ "title": ".dockerignore excludes the production dist directory",
+ "summary": "The image is supposed to serve an already-built static site, but .dockerignore removes dist from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "static-site"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY dist/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "dist"
+ ]
+ },
+ {
+ "path": "dist/index.html",
+ "content": [
+ "",
+ "
ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to compute cache key: failed to calculate checksum of ref: \"/dist\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0005 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0005 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/.dockerignore b/.dockerignore",
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-dist"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "dist"
+ }
+ ]
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0006",
+ "title": "Rust Alpine build misses OpenSSL native packages",
+ "summary": "The crate depends on openssl, but the Alpine builder does not install the native headers and pkg-config needed by openssl-sys.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "rust",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "rust",
+ "alpine",
+ "openssl",
+ "native-deps"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM rust:1.79-alpine AS build",
+ "WORKDIR /src",
+ "COPY Cargo.toml .",
+ "RUN cargo fetch",
+ "COPY src ./src",
+ "RUN cargo build --release"
+ ]
+ },
+ {
+ "path": "Cargo.toml",
+ "content": [
+ "[package]",
+ "name = \"sbd0006\"",
+ "version = \"0.1.0\"",
+ "edition = \"2021\"",
+ "",
+ "[dependencies]",
+ "openssl = \"0.10\""
+ ]
+ },
+ {
+ "path": "src/main.rs",
+ "content": [
+ "fn main() {",
+ " println!(\"ok\");",
+ "}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "error: failed to run custom build command for `openssl-sys`",
+ "Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0006 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0006 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,7 @@",
+ " FROM rust:1.79-alpine AS build",
+ " WORKDIR /src",
+ "+RUN apk add --no-cache musl-dev pkgconfig openssl-dev",
+ " COPY Cargo.toml .",
+ " RUN cargo fetch",
+ " COPY src ./src",
+ " RUN cargo build --release"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache musl-dev pkgconfig openssl-dev"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0007",
+ "title": "Python src layout is not importable in the container",
+ "summary": "The app lives under src/app, but the container runs python -m app without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY requirements.txt .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"app\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": []
+ },
+ {
+ "path": "src/app/__main__.py",
+ "content": [
+ "print(\"ok\")"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named app"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0007 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0007 .",
+ "docker run --rm sabnock/sbd-0007"
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,4 +3,5 @@",
+ " COPY requirements.txt .",
+ " RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"app\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0008",
+ "title": "Poetry install tries to install the app before source files exist",
+ "summary": "The Dockerfile copies only pyproject.toml, then runs poetry install. Poetry attempts to install the root project and fails because package metadata/source files are not present yet.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY service ./service",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"service\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd0008\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"service\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "service/__main__.py",
+ "content": [
+ "print(\"ok\")"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Installing the current project: sbd0008 (0.1.0)",
+ "Error: The current project could not be installed: No file/folder found for package service"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0008 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0008 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY service ./service",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"service\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0009",
+ "title": "Compose bind mount hides node_modules from the image",
+ "summary": "The image installs dependencies, but docker compose bind-mounts the host project over /app. On a clean host without node_modules, runtime imports fail.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " web:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY index.js .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node index.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "index.js",
+ "content": [
+ "require('express')().listen(3000, '0.0.0.0');"
+ ]
+ }
+ ],
+ "failure_log": [
+ "web-1 | Error: Cannot find module 'express'",
+ "web-1 | Require stack: /app/index.js"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/docker-compose.yml b/docker-compose.yml",
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -3,4 +3,5 @@",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0010",
+ "title": "Dockerfile leaks an npm token through ARG and image layers",
+ "summary": "The build uses ARG NPM_TOKEN and writes it to .npmrc in a RUN layer. A secure fix should use BuildKit secrets and remove the temporary .npmrc.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "node",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "node",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "ARG NPM_TOKEN",
+ "COPY package*.json ./",
+ "RUN echo \"//registry.npmjs.org/:_authToken=${NPM_TOKEN}\" > .npmrc && npm ci --omit=dev",
+ "COPY index.js .",
+ "CMD [\"node\", \"index.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node index.js\"},\"dependencies\":{\"left-pad\":\"1.3.0\"}}"
+ ]
+ },
+ {
+ "path": "package-lock.json",
+ "content": [
+ "{\"name\":\"sbd0010\",\"lockfileVersion\":3,\"packages\":{}}"
+ ]
+ },
+ {
+ "path": "index.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "hadolint: SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data",
+ "security-scan: token material may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=npm_token,src=.npm-token -t sabnock/sbd-0010 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,7 +1,7 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ "-ARG NPM_TOKEN",
+ " COPY package*.json ./",
+ "-RUN echo \"//registry.npmjs.org/:_authToken=${NPM_TOKEN}\" > .npmrc && npm ci --omit=dev",
+ "+RUN --mount=type=secret,id=npm_token sh -c 'echo \"//registry.npmjs.org/:_authToken=$(cat /run/secrets/npm_token)\" > .npmrc && npm ci --omit=dev && rm .npmrc'",
+ " COPY index.js .",
+ " CMD [\"node\", \"index.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=npm_token"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm .npmrc"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG NPM_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${NPM_TOKEN}"
+ }
+ ]
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0011",
+ "title": "Ubuntu image installs apt packages without apt-get update",
+ "summary": "The package install runs against an image with no fresh package lists, causing apt to fail in a clean build.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y curl ca-certificates",
+ "CMD [\"curl\", \"--version\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Reading package lists...",
+ "E: Unable to locate package curl",
+ "E: Unable to locate package ca-certificates"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0011 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0011 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y curl ca-certificates",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"curl\", \"--version\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0012",
+ "title": "FastAPI container binds to localhost",
+ "summary": "The app starts inside the container, but Uvicorn binds to 127.0.0.1. Published ports on the host cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "fastapi",
+ "uvicorn",
+ "runtime",
+ "network"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY requirements.txt .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "COPY main.py .",
+ "EXPOSE 8000",
+ "CMD [\"uvicorn\", \"main:app\", \"--host\", \"127.0.0.1\", \"--port\", \"8000\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "fastapi==0.111.0",
+ "uvicorn[standard]==0.30.1"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "from fastapi import FastAPI",
+ "",
+ "app = FastAPI()",
+ "",
+ "@app.get('/health')",
+ "def health():",
+ " return {'status': 'ok'}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "curl: (56) Recv failure: Connection reset by peer",
+ "container log: Uvicorn running on http://127.0.0.1:8000"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0012 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0012 ."
+ ]
+ },
+ "oracle_patch": [
+ "diff --git a/Dockerfile b/Dockerfile",
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -4,4 +4,4 @@",
+ " RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY main.py .",
+ " EXPOSE 8000",
+ "-CMD [\"uvicorn\", \"main:app\", \"--host\", \"127.0.0.1\", \"--port\", \"8000\"]",
+ "+CMD [\"uvicorn\", \"main:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": []
+ },
+ "split": "seed"
+ },
+ {
+ "id": "sbd-0013",
+ "split": "train",
+ "title": "Python api image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY api.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"api.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "flask==3.0.3"
+ ]
+ },
+ {
+ "path": "api.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0013 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0013 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY api.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"api.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0014",
+ "split": "train",
+ "title": "Python server image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY server.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"server.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "fastapi==0.111.0"
+ ]
+ },
+ {
+ "path": "server.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0014 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0014 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY server.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"server.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0015",
+ "split": "train",
+ "title": "Python worker image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY worker.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"worker.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "requests==2.32.3"
+ ]
+ },
+ {
+ "path": "worker.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0015 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0015 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY worker.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"worker.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0016",
+ "split": "train",
+ "title": "Python jobs image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY jobs.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"jobs.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "httpx==0.27.2"
+ ]
+ },
+ {
+ "path": "jobs.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0016 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0016 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY jobs.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"jobs.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0017",
+ "split": "train",
+ "title": "Python gateway image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY gateway.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"gateway.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "starlette==0.37.2"
+ ]
+ },
+ {
+ "path": "gateway.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0017 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0017 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY gateway.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"gateway.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0018",
+ "split": "train",
+ "title": "Python hooks image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY hooks.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"hooks.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "pydantic==2.8.2"
+ ]
+ },
+ {
+ "path": "hooks.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0018 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0018 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY hooks.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"hooks.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0019",
+ "split": "train",
+ "title": "Python tasks image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY tasks.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"tasks.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "redis==5.0.7"
+ ]
+ },
+ {
+ "path": "tasks.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0019 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0019 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY tasks.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"tasks.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0020",
+ "split": "train",
+ "title": "Python ingest image misses requirements before pip install",
+ "summary": "The Dockerfile runs pip against requirements.txt before copying that file into the image.",
+ "failure_type": "missing_build_context_file",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "pip",
+ "build-context"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY ingest.py .",
+ "RUN pip install --no-cache-dir -r requirements.txt",
+ "CMD [\"python\", \"ingest.py\"]"
+ ]
+ },
+ {
+ "path": "requirements.txt",
+ "content": [
+ "click==8.1.7"
+ ]
+ },
+ {
+ "path": "ingest.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0020 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0020 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,5 +1,6 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ "+COPY requirements.txt .",
+ "+RUN pip install --no-cache-dir -r requirements.txt",
+ " COPY ingest.py .",
+ "-RUN pip install --no-cache-dir -r requirements.txt",
+ " CMD [\"python\", \"ingest.py\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "COPY requirements.txt ."
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0021",
+ "split": "train",
+ "title": "Node api image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY api.js .",
+ "CMD [\"node\", \"api.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node api.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "api.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0021 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0021 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY api.js .",
+ " CMD [\"node\", \"api.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0022",
+ "split": "train",
+ "title": "Node dashboard image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY dashboard.js .",
+ "CMD [\"node\", \"dashboard.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node dashboard.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "dashboard.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0022 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0022 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY dashboard.js .",
+ " CMD [\"node\", \"dashboard.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0023",
+ "split": "train",
+ "title": "Node worker image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY worker.js .",
+ "CMD [\"node\", \"worker.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node worker.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "worker.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0023 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0023 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY worker.js .",
+ " CMD [\"node\", \"worker.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0024",
+ "split": "train",
+ "title": "Node gateway image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY gateway.js .",
+ "CMD [\"node\", \"gateway.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node gateway.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "gateway.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0024 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0024 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY gateway.js .",
+ " CMD [\"node\", \"gateway.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0025",
+ "split": "train",
+ "title": "Node webhook image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY webhook.js .",
+ "CMD [\"node\", \"webhook.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node webhook.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "webhook.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0025 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0025 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY webhook.js .",
+ " CMD [\"node\", \"webhook.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0026",
+ "split": "train",
+ "title": "Node realtime image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY realtime.js .",
+ "CMD [\"node\", \"realtime.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node realtime.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "realtime.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0026 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0026 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY realtime.js .",
+ " CMD [\"node\", \"realtime.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0027",
+ "split": "train",
+ "title": "Node admin image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY admin.js .",
+ "CMD [\"node\", \"admin.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node admin.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "admin.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0027 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0027 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY admin.js .",
+ " CMD [\"node\", \"admin.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0028",
+ "split": "train",
+ "title": "Node docs image uses npm ci without a lockfile",
+ "summary": "The Dockerfile uses npm ci, but the repository does not include package-lock.json.",
+ "failure_type": "lockfile_missing",
+ "ecosystem": "node",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "node",
+ "npm",
+ "lockfile"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm ci --omit=dev",
+ "COPY docs.js .",
+ "CMD [\"node\", \"docs.js\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node docs.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "docs.js",
+ "content": [
+ "console.log('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "npm ERR! The `npm ci` command can only install with an existing package-lock.json or npm-shrinkwrap.json."
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0028 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0028 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,6 @@",
+ " FROM node:22-alpine",
+ " WORKDIR /app",
+ " COPY package.json .",
+ "-RUN npm ci --omit=dev",
+ "+RUN npm install --omit=dev",
+ " COPY docs.js .",
+ " CMD [\"node\", \"docs.js\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "RUN npm install --omit=dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0029",
+ "split": "train",
+ "title": "Go runtime stage copies api but builder emits server",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/server ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/api /usr/local/bin/api",
+ "CMD [\"api\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0029",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/api\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0029 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0029 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/server ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/api /usr/local/bin/api",
+ "-CMD [\"api\"]",
+ "+COPY --from=build /out/server /usr/local/bin/server",
+ "+CMD [\"server\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/server /usr/local/bin/server"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"server\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0030",
+ "split": "train",
+ "title": "Go runtime stage copies jobs but builder emits worker",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/worker ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/jobs /usr/local/bin/jobs",
+ "CMD [\"jobs\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0030",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/jobs\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0030 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0030 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/worker ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/jobs /usr/local/bin/jobs",
+ "-CMD [\"jobs\"]",
+ "+COPY --from=build /out/worker /usr/local/bin/worker",
+ "+CMD [\"worker\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/worker /usr/local/bin/worker"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"worker\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0031",
+ "split": "train",
+ "title": "Go runtime stage copies edge but builder emits gateway",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/gateway ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/edge /usr/local/bin/edge",
+ "CMD [\"edge\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0031",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/edge\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0031 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0031 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/gateway ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/edge /usr/local/bin/edge",
+ "-CMD [\"edge\"]",
+ "+COPY --from=build /out/gateway /usr/local/bin/gateway",
+ "+CMD [\"gateway\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/gateway /usr/local/bin/gateway"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"gateway\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0032",
+ "split": "train",
+ "title": "Go runtime stage copies agent but builder emits collector",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/collector ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/agent /usr/local/bin/agent",
+ "CMD [\"agent\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0032",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/agent\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0032 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0032 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/collector ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/agent /usr/local/bin/agent",
+ "-CMD [\"agent\"]",
+ "+COPY --from=build /out/collector /usr/local/bin/collector",
+ "+CMD [\"collector\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/collector /usr/local/bin/collector"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"collector\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0033",
+ "split": "train",
+ "title": "Go runtime stage copies cron but builder emits scheduler",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/scheduler ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/cron /usr/local/bin/cron",
+ "CMD [\"cron\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0033",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/cron\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0033 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0033 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/scheduler ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/cron /usr/local/bin/cron",
+ "-CMD [\"cron\"]",
+ "+COPY --from=build /out/scheduler /usr/local/bin/scheduler",
+ "+CMD [\"scheduler\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/scheduler /usr/local/bin/scheduler"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"scheduler\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0034",
+ "split": "train",
+ "title": "Go runtime stage copies proxy but builder emits router",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/router ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/proxy /usr/local/bin/proxy",
+ "CMD [\"proxy\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0034",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/proxy\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0034 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0034 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/router ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/proxy /usr/local/bin/proxy",
+ "-CMD [\"proxy\"]",
+ "+COPY --from=build /out/router /usr/local/bin/router",
+ "+CMD [\"router\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/router /usr/local/bin/router"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"router\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0035",
+ "split": "train",
+ "title": "Go runtime stage copies search but builder emits indexer",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/indexer ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/search /usr/local/bin/search",
+ "CMD [\"search\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0035",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/search\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0035 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0035 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/indexer ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/search /usr/local/bin/search",
+ "-CMD [\"search\"]",
+ "+COPY --from=build /out/indexer /usr/local/bin/indexer",
+ "+CMD [\"indexer\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/indexer /usr/local/bin/indexer"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"indexer\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0036",
+ "split": "train",
+ "title": "Go runtime stage copies events but builder emits notifier",
+ "summary": "The final image copies a binary name that does not exist in the builder stage.",
+ "failure_type": "multistage_artifact_mismatch",
+ "ecosystem": "go",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "go",
+ "multi-stage",
+ "artifact"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM golang:1.23-alpine AS build",
+ "WORKDIR /src",
+ "COPY go.mod main.go ./",
+ "RUN go build -o /out/notifier ./...",
+ "FROM alpine:3.20",
+ "COPY --from=build /out/events /usr/local/bin/events",
+ "CMD [\"events\"]"
+ ]
+ },
+ {
+ "path": "go.mod",
+ "content": [
+ "module example.com/sabnock/sbd-0036",
+ "",
+ "go 1.23"
+ ]
+ },
+ {
+ "path": "main.go",
+ "content": [
+ "package main",
+ "",
+ "func main() {}"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out/events\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0036 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0036 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -3,5 +3,5 @@",
+ " COPY go.mod main.go ./",
+ " RUN go build -o /out/notifier ./...",
+ " FROM alpine:3.20",
+ "-COPY --from=build /out/events /usr/local/bin/events",
+ "-CMD [\"events\"]",
+ "+COPY --from=build /out/notifier /usr/local/bin/notifier",
+ "+CMD [\"notifier\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "/out/notifier /usr/local/bin/notifier"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "CMD [\"notifier\"]"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0037",
+ "split": "train",
+ "title": ".dockerignore excludes dist from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY dist/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "dist"
+ ]
+ },
+ {
+ "path": "dist/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/dist\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0037 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0037 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-dist"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "dist"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0038",
+ "split": "train",
+ "title": ".dockerignore excludes build from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY build/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "build"
+ ]
+ },
+ {
+ "path": "build/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/build\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0038 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0038 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-build"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "build"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0039",
+ "split": "train",
+ "title": ".dockerignore excludes out from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY out/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "out"
+ ]
+ },
+ {
+ "path": "out/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/out\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0039 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0039 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-out"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "out"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0040",
+ "split": "train",
+ "title": ".dockerignore excludes site from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY site/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "site"
+ ]
+ },
+ {
+ "path": "site/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/site\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0040 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0040 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-site"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "site"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0041",
+ "split": "train",
+ "title": ".dockerignore excludes public from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY public/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "public"
+ ]
+ },
+ {
+ "path": "public/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/public\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0041 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0041 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-public"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "public"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0042",
+ "split": "train",
+ "title": ".dockerignore excludes webroot from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY webroot/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "webroot"
+ ]
+ },
+ {
+ "path": "webroot/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/webroot\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0042 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0042 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-webroot"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "webroot"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0043",
+ "split": "train",
+ "title": ".dockerignore excludes release from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY release/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "release"
+ ]
+ },
+ {
+ "path": "release/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/release\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0043 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0043 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-release"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "release"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0044",
+ "split": "train",
+ "title": ".dockerignore excludes static from a static image",
+ "summary": "The Docker build needs a generated static artifact, but .dockerignore removes that directory from the build context.",
+ "failure_type": "dockerignore_artifact_excluded",
+ "ecosystem": "frontend",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "dockerignore",
+ "nginx",
+ "frontend"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM nginx:1.27-alpine",
+ "COPY static/ /usr/share/nginx/html/"
+ ]
+ },
+ {
+ "path": ".dockerignore",
+ "content": [
+ "node_modules",
+ "static"
+ ]
+ },
+ {
+ "path": "static/index.html",
+ "content": [
+ "ok"
+ ]
+ }
+ ],
+ "failure_log": [
+ "failed to calculate checksum of ref: \"/static\": not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0044 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0044 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/.dockerignore",
+ "+++ b/.dockerignore",
+ "@@ -1,2 +1 @@",
+ " node_modules",
+ "-static"
+ ],
+ "scoring": {
+ "must_touch": [
+ ".dockerignore"
+ ],
+ "must_contain": [],
+ "must_not_contain": [
+ {
+ "path": ".dockerignore",
+ "text": "static"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0045",
+ "split": "train",
+ "title": "Ubuntu image installs curl without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y curl ca-certificates",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0045 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0045 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y curl ca-certificates",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0046",
+ "split": "train",
+ "title": "Ubuntu image installs git without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y git openssh-client",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0046 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0046 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y git openssh-client",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends git openssh-client && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0047",
+ "split": "train",
+ "title": "Ubuntu image installs python3 without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y python3 python3-pip",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0047 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0047 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y python3 python3-pip",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends python3 python3-pip && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0048",
+ "split": "train",
+ "title": "Ubuntu image installs build-essential without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y build-essential pkg-config",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0048 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0048 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y build-essential pkg-config",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends build-essential pkg-config && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0049",
+ "split": "train",
+ "title": "Ubuntu image installs postgresql-client without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y postgresql-client ca-certificates",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0049 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0049 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y postgresql-client ca-certificates",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client ca-certificates && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0050",
+ "split": "train",
+ "title": "Ubuntu image installs ffmpeg without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y ffmpeg libsm6",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0050 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0050 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y ffmpeg libsm6",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg libsm6 && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0051",
+ "split": "train",
+ "title": "Ubuntu image installs tini without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y tini curl",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0051 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0051 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y tini curl",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends tini curl && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0052",
+ "split": "train",
+ "title": "Ubuntu image installs jq without apt-get update",
+ "summary": "The Dockerfile installs apt packages before refreshing package lists.",
+ "failure_type": "apt_update_missing",
+ "ecosystem": "linux",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "apt",
+ "ubuntu",
+ "package-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM ubuntu:24.04",
+ "RUN apt-get install -y jq ca-certificates",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "E: Unable to locate package"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0052 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0052 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,3 +1,3 @@",
+ " FROM ubuntu:24.04",
+ "-RUN apt-get install -y jq ca-certificates",
+ "+RUN apt-get update && apt-get install -y --no-install-recommends jq ca-certificates && rm -rf /var/lib/apt/lists/*",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apt-get update && apt-get install"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "rm -rf /var/lib/apt/lists/*"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0053",
+ "split": "train",
+ "title": "fastapi container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 8000",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"8000\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:8000",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0053 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0053 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 8000",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"8000\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0054",
+ "split": "train",
+ "title": "flask container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 8080",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"8080\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:8080",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0054 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0054 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 8080",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"8080\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"8080\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0055",
+ "split": "train",
+ "title": "express container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 3000",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"3000\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:3000",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0055 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0055 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 3000",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"3000\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"3000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0056",
+ "split": "train",
+ "title": "api container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 5000",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"5000\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:5000",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0056 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0056 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 5000",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"5000\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"5000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0057",
+ "split": "train",
+ "title": "metrics container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 9000",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"9000\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:9000",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0057 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0057 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 9000",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"9000\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"9000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0058",
+ "split": "train",
+ "title": "worker container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 7000",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"7000\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:7000",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0058 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0058 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 7000",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"7000\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"7000\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0059",
+ "split": "train",
+ "title": "vite container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 5173",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"5173\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:5173",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0059 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0059 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 5173",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"5173\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"5173\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0060",
+ "split": "train",
+ "title": "admin container binds to localhost",
+ "summary": "The service listens on 127.0.0.1 inside the container, so host port publishing cannot reach it.",
+ "failure_type": "container_network_binding",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "network",
+ "runtime",
+ "ports"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY main.py .",
+ "EXPOSE 4200",
+ "CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"4200\"]"
+ ]
+ },
+ {
+ "path": "main.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "service log: listening on http://127.0.0.1:4200",
+ "host probe: connection refused"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0060 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0060 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,4 +2,4 @@",
+ " WORKDIR /app",
+ " COPY main.py .",
+ " EXPOSE 4200",
+ "-CMD [\"python\", \"main.py\", \"--host\", \"127.0.0.1\", \"--port\", \"4200\"]",
+ "+CMD [\"python\", \"main.py\", \"--host\", \"0.0.0.0\", \"--port\", \"4200\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "0.0.0.0"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "127.0.0.1"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0061",
+ "split": "train",
+ "title": "Compose api starts before postgres is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "postgres",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - postgres",
+ " postgres:",
+ " image: postgres:16-alpine",
+ " environment:",
+ " POSTGRES_PASSWORD: postgres"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "postgres-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,8 +2,14 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - postgres",
+ "+ postgres:",
+ "+ condition: service_healthy",
+ " postgres:",
+ " image: postgres:16-alpine",
+ " environment:",
+ " POSTGRES_PASSWORD: postgres",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"pg_isready -U postgres\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "pg_isready -U postgres"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0062",
+ "split": "train",
+ "title": "Compose api starts before redis is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "redis",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - redis",
+ " redis:",
+ " image: redis:7-alpine"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "redis-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,6 +2,12 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - redis",
+ "+ redis:",
+ "+ condition: service_healthy",
+ " redis:",
+ " image: redis:7-alpine",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"redis-cli ping\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "redis-cli ping"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0063",
+ "split": "train",
+ "title": "Compose api starts before mysql is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "mysql",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - mysql",
+ " mysql:",
+ " image: mysql:8",
+ " environment:",
+ " MYSQL_ROOT_PASSWORD: mysql"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "mysql-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,8 +2,14 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - mysql",
+ "+ mysql:",
+ "+ condition: service_healthy",
+ " mysql:",
+ " image: mysql:8",
+ " environment:",
+ " MYSQL_ROOT_PASSWORD: mysql",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"mysqladmin ping -h localhost\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "mysqladmin ping -h localhost"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0064",
+ "split": "train",
+ "title": "Compose api starts before mongo is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "mongo",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - mongo",
+ " mongo:",
+ " image: mongo:7"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "mongo-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,6 +2,12 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - mongo",
+ "+ mongo:",
+ "+ condition: service_healthy",
+ " mongo:",
+ " image: mongo:7",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"mongosh --eval 'db.runCommand({ ping: 1 })'\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "mongosh --eval 'db.runCommand({ ping: 1 })'"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0065",
+ "split": "train",
+ "title": "Compose api starts before rabbit is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "rabbit",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - rabbit",
+ " rabbit:",
+ " image: rabbitmq:3-alpine"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "rabbit-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,6 +2,12 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - rabbit",
+ "+ rabbit:",
+ "+ condition: service_healthy",
+ " rabbit:",
+ " image: rabbitmq:3-alpine",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"rabbitmq-diagnostics -q ping\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "rabbitmq-diagnostics -q ping"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0066",
+ "split": "train",
+ "title": "Compose api starts before elastic is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "elastic",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - elastic",
+ " elastic:",
+ " image: elasticsearch:8.14.0",
+ " environment:",
+ " discovery.type: single-node"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "elastic-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,8 +2,14 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - elastic",
+ "+ elastic:",
+ "+ condition: service_healthy",
+ " elastic:",
+ " image: elasticsearch:8.14.0",
+ " environment:",
+ " discovery.type: single-node",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"curl -fsS http://localhost:9200 || exit 1\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "curl -fsS http://localhost:9200 || exit 1"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0067",
+ "split": "train",
+ "title": "Compose api starts before minio is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "minio",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - minio",
+ " minio:",
+ " image: minio/minio:RELEASE.2024-07-16T23-46-41Z"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "minio-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,6 +2,12 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - minio",
+ "+ minio:",
+ "+ condition: service_healthy",
+ " minio:",
+ " image: minio/minio:RELEASE.2024-07-16T23-46-41Z",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"curl -fsS http://localhost:9000/minio/health/live || exit 1\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "curl -fsS http://localhost:9000/minio/health/live || exit 1"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0068",
+ "split": "train",
+ "title": "Compose api starts before mailhog is healthy",
+ "summary": "depends_on orders container startup but does not wait for service readiness without a healthcheck condition.",
+ "failure_type": "compose_readiness",
+ "ecosystem": "compose",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "healthcheck",
+ "mailhog",
+ "readiness"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " api:",
+ " build: .",
+ " depends_on:",
+ " - mailhog",
+ " mailhog:",
+ " image: mailhog/mailhog:v1.0.1"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "api-1 | connection refused",
+ "mailhog-1 | service is still starting"
+ ],
+ "build": {
+ "command": "docker compose up --build --abort-on-container-exit"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -2,6 +2,12 @@",
+ " api:",
+ " build: .",
+ " depends_on:",
+ "- - mailhog",
+ "+ mailhog:",
+ "+ condition: service_healthy",
+ " mailhog:",
+ " image: mailhog/mailhog:v1.0.1",
+ "+ healthcheck:",
+ "+ test: [\"CMD-SHELL\", \"wget -q -O- http://localhost:8025 || exit 1\"]",
+ "+ interval: 2s",
+ "+ timeout: 3s",
+ "+ retries: 20"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "condition: service_healthy"
+ },
+ {
+ "path": "docker-compose.yml",
+ "text": "wget -q -O- http://localhost:8025 || exit 1"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0069",
+ "split": "train",
+ "title": "Compose bind mount hides api node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node api.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "api.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0070",
+ "split": "train",
+ "title": "Compose bind mount hides web node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node web.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "web.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0071",
+ "split": "train",
+ "title": "Compose bind mount hides admin node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node admin.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "admin.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0072",
+ "split": "train",
+ "title": "Compose bind mount hides worker node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node worker.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "worker.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0073",
+ "split": "train",
+ "title": "Compose bind mount hides jobs node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node jobs.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "jobs.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0074",
+ "split": "train",
+ "title": "Compose bind mount hides gateway node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node gateway.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "gateway.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0075",
+ "split": "train",
+ "title": "Compose bind mount hides socket node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node socket.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "socket.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0076",
+ "split": "train",
+ "title": "Compose bind mount hides client node_modules",
+ "summary": "A host bind mount overlays /app and hides dependencies installed into the image.",
+ "failure_type": "compose_bind_mount_masks_dependencies",
+ "ecosystem": "node",
+ "difficulty": "medium",
+ "tags": [
+ "compose",
+ "node",
+ "bind-mount",
+ "node_modules"
+ ],
+ "files": [
+ {
+ "path": "docker-compose.yml",
+ "content": [
+ "services:",
+ " app:",
+ " build: .",
+ " command: npm start",
+ " volumes:",
+ " - .:/app"
+ ]
+ },
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM node:22-alpine",
+ "WORKDIR /app",
+ "COPY package.json .",
+ "RUN npm install",
+ "COPY . .",
+ "CMD [\"npm\", \"start\"]"
+ ]
+ },
+ {
+ "path": "package.json",
+ "content": [
+ "{\"scripts\":{\"start\":\"node client.js\"},\"dependencies\":{\"express\":\"4.19.2\"}}"
+ ]
+ },
+ {
+ "path": "client.js",
+ "content": [
+ "console.log(require('express') ? 'ok' : 'bad')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: Cannot find module 'express'"
+ ],
+ "build": {
+ "command": "docker compose up --build"
+ },
+ "verify": {
+ "commands": [
+ "docker compose config --quiet"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/docker-compose.yml",
+ "+++ b/docker-compose.yml",
+ "@@ -4,3 +4,4 @@",
+ " command: npm start",
+ " volumes:",
+ " - .:/app",
+ "+ - /app/node_modules"
+ ],
+ "scoring": {
+ "must_touch": [
+ "docker-compose.yml"
+ ],
+ "must_contain": [
+ {
+ "path": "docker-compose.yml",
+ "text": "/app/node_modules"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0077",
+ "split": "train",
+ "title": "Python src layout cannot import service",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"service\"]"
+ ]
+ },
+ {
+ "path": "src/service/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named service"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0077 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0077 .",
+ "docker run --rm sabnock/sbd-0077"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"service\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0078",
+ "split": "train",
+ "title": "Python src layout cannot import api",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"api\"]"
+ ]
+ },
+ {
+ "path": "src/api/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named api"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0078 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0078 .",
+ "docker run --rm sabnock/sbd-0078"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"api\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0079",
+ "split": "train",
+ "title": "Python src layout cannot import worker",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"worker\"]"
+ ]
+ },
+ {
+ "path": "src/worker/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named worker"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0079 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0079 .",
+ "docker run --rm sabnock/sbd-0079"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"worker\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0080",
+ "split": "train",
+ "title": "Python src layout cannot import gateway",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"gateway\"]"
+ ]
+ },
+ {
+ "path": "src/gateway/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named gateway"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0080 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0080 .",
+ "docker run --rm sabnock/sbd-0080"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"gateway\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0081",
+ "split": "train",
+ "title": "Python src layout cannot import billing",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"billing\"]"
+ ]
+ },
+ {
+ "path": "src/billing/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named billing"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0081 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0081 .",
+ "docker run --rm sabnock/sbd-0081"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"billing\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0082",
+ "split": "train",
+ "title": "Python src layout cannot import search",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"search\"]"
+ ]
+ },
+ {
+ "path": "src/search/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named search"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0082 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0082 .",
+ "docker run --rm sabnock/sbd-0082"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"search\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0083",
+ "split": "train",
+ "title": "Python src layout cannot import events",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"events\"]"
+ ]
+ },
+ {
+ "path": "src/events/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named events"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0083 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0083 .",
+ "docker run --rm sabnock/sbd-0083"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"events\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0084",
+ "split": "train",
+ "title": "Python src layout cannot import ingest",
+ "summary": "The package is under src, but the runtime command imports it without adding /app/src to PYTHONPATH.",
+ "failure_type": "python_src_layout_import",
+ "ecosystem": "python",
+ "difficulty": "easy",
+ "tags": [
+ "dockerfile",
+ "python",
+ "src-layout",
+ "runtime"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "COPY src ./src",
+ "CMD [\"python\", \"-m\", \"ingest\"]"
+ ]
+ },
+ {
+ "path": "src/ingest/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "/usr/local/bin/python: No module named ingest"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0084 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0084 .",
+ "docker run --rm sabnock/sbd-0084"
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-slim",
+ " WORKDIR /app",
+ " COPY src ./src",
+ "+ENV PYTHONPATH=/app/src",
+ " CMD [\"python\", \"-m\", \"ingest\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ENV PYTHONPATH=/app/src"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0085",
+ "split": "validation",
+ "title": "Alpine build misses native packages for openssl",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "openssl"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir openssl",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "openssl-sys"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0085 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0085 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache pkgconfig openssl-dev musl-dev",
+ " RUN pip install --no-cache-dir openssl",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache pkgconfig openssl-dev musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0086",
+ "split": "validation",
+ "title": "Alpine build misses native packages for psycopg2",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "psycopg2"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir psycopg2",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "pg_config executable not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0086 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0086 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache postgresql-dev gcc musl-dev",
+ " RUN pip install --no-cache-dir psycopg2",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache postgresql-dev gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0087",
+ "split": "validation",
+ "title": "Alpine build misses native packages for pillow",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "pillow"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir pillow",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "The headers or library files could not be found for jpeg"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0087 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0087 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache jpeg-dev zlib-dev gcc musl-dev",
+ " RUN pip install --no-cache-dir pillow",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache jpeg-dev zlib-dev gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0088",
+ "split": "validation",
+ "title": "Alpine build misses native packages for lxml",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "lxml"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir lxml",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Please make sure the libxml2 and libxslt development packages are installed"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0088 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0088 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache libxml2-dev libxslt-dev gcc musl-dev",
+ " RUN pip install --no-cache-dir lxml",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache libxml2-dev libxslt-dev gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0089",
+ "split": "validation",
+ "title": "Alpine build misses native packages for cryptography",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "cryptography"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir cryptography",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "error: can't find Rust compiler"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0089 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0089 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache openssl-dev cargo gcc musl-dev",
+ " RUN pip install --no-cache-dir cryptography",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache openssl-dev cargo gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0090",
+ "split": "validation",
+ "title": "Alpine build misses native packages for mysqlclient",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "mysqlclient"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir mysqlclient",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "mysql_config not found"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0090 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0090 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache mariadb-dev gcc musl-dev",
+ " RUN pip install --no-cache-dir mysqlclient",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache mariadb-dev gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0091",
+ "split": "validation",
+ "title": "Alpine build misses native packages for cffi",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "cffi"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir cffi",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "ffi.h: No such file or directory"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0091 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0091 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache libffi-dev gcc musl-dev",
+ " RUN pip install --no-cache-dir cffi",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache libffi-dev gcc musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0092",
+ "split": "validation",
+ "title": "Alpine build misses native packages for numpy",
+ "summary": "The package requires system headers or compilers that are absent from the Alpine image.",
+ "failure_type": "native_dependency_missing",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "alpine",
+ "native-deps",
+ "numpy"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-alpine",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir numpy",
+ "CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Failed building wheel"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0092 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0092 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,4 +1,5 @@",
+ " FROM python:3.12-alpine",
+ " WORKDIR /app",
+ "+RUN apk add --no-cache gfortran openblas-dev musl-dev",
+ " RUN pip install --no-cache-dir numpy",
+ " CMD [\"python\", \"-c\", \"print('ok')\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "apk add --no-cache gfortran openblas-dev musl-dev"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0093",
+ "split": "validation",
+ "title": "Dockerfile leaks NPM_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG NPM_TOKEN",
+ "RUN echo \"token=${NPM_TOKEN}\" > .credentials",
+ "RUN wget -q https://registry.npmjs.org -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=npm_token,src=.npm_token -t sabnock/sbd-0093 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG NPM_TOKEN",
+ "-RUN echo \"token=${NPM_TOKEN}\" > .credentials",
+ "-RUN wget -q https://registry.npmjs.org -O /dev/null || true",
+ "+RUN --mount=type=secret,id=npm_token sh -c 'test -s /run/secrets/npm_token && wget -q https://registry.npmjs.org -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=npm_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG NPM_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${NPM_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0094",
+ "split": "validation",
+ "title": "Dockerfile leaks PYPI_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG PYPI_TOKEN",
+ "RUN echo \"token=${PYPI_TOKEN}\" > .credentials",
+ "RUN wget -q https://pypi.org -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=pypi_token,src=.pypi_token -t sabnock/sbd-0094 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG PYPI_TOKEN",
+ "-RUN echo \"token=${PYPI_TOKEN}\" > .credentials",
+ "-RUN wget -q https://pypi.org -O /dev/null || true",
+ "+RUN --mount=type=secret,id=pypi_token sh -c 'test -s /run/secrets/pypi_token && wget -q https://pypi.org -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=pypi_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG PYPI_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${PYPI_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0095",
+ "split": "validation",
+ "title": "Dockerfile leaks GITHUB_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG GITHUB_TOKEN",
+ "RUN echo \"token=${GITHUB_TOKEN}\" > .credentials",
+ "RUN wget -q https://github.com -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=github_token,src=.github_token -t sabnock/sbd-0095 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG GITHUB_TOKEN",
+ "-RUN echo \"token=${GITHUB_TOKEN}\" > .credentials",
+ "-RUN wget -q https://github.com -O /dev/null || true",
+ "+RUN --mount=type=secret,id=github_token sh -c 'test -s /run/secrets/github_token && wget -q https://github.com -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=github_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG GITHUB_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${GITHUB_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0096",
+ "split": "validation",
+ "title": "Dockerfile leaks GEM_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG GEM_TOKEN",
+ "RUN echo \"token=${GEM_TOKEN}\" > .credentials",
+ "RUN wget -q https://rubygems.org -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=gem_token,src=.gem_token -t sabnock/sbd-0096 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG GEM_TOKEN",
+ "-RUN echo \"token=${GEM_TOKEN}\" > .credentials",
+ "-RUN wget -q https://rubygems.org -O /dev/null || true",
+ "+RUN --mount=type=secret,id=gem_token sh -c 'test -s /run/secrets/gem_token && wget -q https://rubygems.org -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=gem_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG GEM_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${GEM_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0097",
+ "split": "challenge",
+ "title": "Dockerfile leaks CARGO_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG CARGO_TOKEN",
+ "RUN echo \"token=${CARGO_TOKEN}\" > .credentials",
+ "RUN wget -q https://crates.io -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=cargo_token,src=.cargo_token -t sabnock/sbd-0097 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG CARGO_TOKEN",
+ "-RUN echo \"token=${CARGO_TOKEN}\" > .credentials",
+ "-RUN wget -q https://crates.io -O /dev/null || true",
+ "+RUN --mount=type=secret,id=cargo_token sh -c 'test -s /run/secrets/cargo_token && wget -q https://crates.io -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=cargo_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG CARGO_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${CARGO_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0098",
+ "split": "challenge",
+ "title": "Dockerfile leaks NUGET_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG NUGET_TOKEN",
+ "RUN echo \"token=${NUGET_TOKEN}\" > .credentials",
+ "RUN wget -q https://nuget.org -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=nuget_token,src=.nuget_token -t sabnock/sbd-0098 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG NUGET_TOKEN",
+ "-RUN echo \"token=${NUGET_TOKEN}\" > .credentials",
+ "-RUN wget -q https://nuget.org -O /dev/null || true",
+ "+RUN --mount=type=secret,id=nuget_token sh -c 'test -s /run/secrets/nuget_token && wget -q https://nuget.org -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=nuget_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG NUGET_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${NUGET_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0099",
+ "split": "challenge",
+ "title": "Dockerfile leaks GITLAB_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG GITLAB_TOKEN",
+ "RUN echo \"token=${GITLAB_TOKEN}\" > .credentials",
+ "RUN wget -q https://gitlab.com -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=gitlab_token,src=.gitlab_token -t sabnock/sbd-0099 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG GITLAB_TOKEN",
+ "-RUN echo \"token=${GITLAB_TOKEN}\" > .credentials",
+ "-RUN wget -q https://gitlab.com -O /dev/null || true",
+ "+RUN --mount=type=secret,id=gitlab_token sh -c 'test -s /run/secrets/gitlab_token && wget -q https://gitlab.com -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=gitlab_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG GITLAB_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${GITLAB_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0100",
+ "split": "challenge",
+ "title": "Dockerfile leaks SENTRY_AUTH_TOKEN through ARG",
+ "summary": "The Dockerfile passes a secret through ARG and writes it into a layer instead of using a BuildKit secret mount.",
+ "failure_type": "build_secret_leak",
+ "ecosystem": "security",
+ "difficulty": "hard",
+ "tags": [
+ "dockerfile",
+ "buildkit",
+ "secrets",
+ "security"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM alpine:3.20",
+ "WORKDIR /app",
+ "ARG SENTRY_AUTH_TOKEN",
+ "RUN echo \"token=${SENTRY_AUTH_TOKEN}\" > .credentials",
+ "RUN wget -q https://sentry.io -O /dev/null || true",
+ "CMD [\"true\"]"
+ ]
+ }
+ ],
+ "failure_log": [
+ "security-scan: SecretsUsedInArgOrEnv",
+ "security-scan: secret may persist in image layer history"
+ ],
+ "build": {
+ "command": "DOCKER_BUILDKIT=1 docker build --secret id=sentry_token,src=.sentry_token -t sabnock/sbd-0100 ."
+ },
+ "verify": {
+ "commands": [
+ "docker buildx build --check ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -1,6 +1,5 @@",
+ "+# syntax=docker/dockerfile:1.7",
+ " FROM alpine:3.20",
+ " WORKDIR /app",
+ "-ARG SENTRY_AUTH_TOKEN",
+ "-RUN echo \"token=${SENTRY_AUTH_TOKEN}\" > .credentials",
+ "-RUN wget -q https://sentry.io -O /dev/null || true",
+ "+RUN --mount=type=secret,id=sentry_token sh -c 'test -s /run/secrets/sentry_token && wget -q https://sentry.io -O /dev/null || true'",
+ " CMD [\"true\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "# syntax=docker/dockerfile:1.7"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "--mount=type=secret,id=sentry_token"
+ }
+ ],
+ "must_not_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "ARG SENTRY_AUTH_TOKEN"
+ },
+ {
+ "path": "Dockerfile",
+ "text": "${SENTRY_AUTH_TOKEN}"
+ }
+ ]
+ }
+ },
+ {
+ "id": "sbd-0101",
+ "split": "challenge",
+ "title": "Poetry install runs before service source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY service ./service",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"service\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0101\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"service\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "service/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package service"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0101 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0101 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY service ./service",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"service\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0102",
+ "split": "challenge",
+ "title": "Poetry install runs before api source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY api ./api",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"api\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0102\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"api\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "api/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package api"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0102 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0102 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY api ./api",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"api\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0103",
+ "split": "challenge",
+ "title": "Poetry install runs before worker source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY worker ./worker",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"worker\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0103\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"worker\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "worker/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package worker"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0103 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0103 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY worker ./worker",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"worker\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0104",
+ "split": "challenge",
+ "title": "Poetry install runs before jobs source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY jobs ./jobs",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"jobs\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0104\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"jobs\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "jobs/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package jobs"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0104 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0104 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY jobs ./jobs",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"jobs\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0105",
+ "split": "challenge",
+ "title": "Poetry install runs before billing source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY billing ./billing",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"billing\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0105\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"billing\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "billing/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package billing"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0105 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0105 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY billing ./billing",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"billing\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0106",
+ "split": "challenge",
+ "title": "Poetry install runs before search source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY search ./search",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"search\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0106\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"search\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "search/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package search"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0106 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0106 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY search ./search",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"search\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0107",
+ "split": "challenge",
+ "title": "Poetry install runs before gateway source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY gateway ./gateway",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"gateway\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0107\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"gateway\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "gateway/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package gateway"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0107 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0107 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY gateway ./gateway",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"gateway\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ },
+ {
+ "id": "sbd-0108",
+ "split": "challenge",
+ "title": "Poetry install runs before scheduler source exists",
+ "summary": "Poetry tries to install the root project before the package directory is copied into the image.",
+ "failure_type": "poetry_root_install_order",
+ "ecosystem": "python",
+ "difficulty": "medium",
+ "tags": [
+ "dockerfile",
+ "python",
+ "poetry",
+ "dependency-install"
+ ],
+ "files": [
+ {
+ "path": "Dockerfile",
+ "content": [
+ "FROM python:3.12-slim",
+ "WORKDIR /app",
+ "RUN pip install --no-cache-dir poetry==1.8.3",
+ "COPY pyproject.toml ./",
+ "RUN poetry install --only main",
+ "COPY scheduler ./scheduler",
+ "CMD [\"poetry\", \"run\", \"python\", \"-m\", \"scheduler\"]"
+ ]
+ },
+ {
+ "path": "pyproject.toml",
+ "content": [
+ "[tool.poetry]",
+ "name = \"sbd-0108\"",
+ "version = \"0.1.0\"",
+ "description = \"synthetic task\"",
+ "authors = [\"Sabnock \"]",
+ "packages = [{ include = \"scheduler\" }]",
+ "",
+ "[tool.poetry.dependencies]",
+ "python = \"^3.12\"",
+ "",
+ "[build-system]",
+ "requires = [\"poetry-core\"]",
+ "build-backend = \"poetry.core.masonry.api\""
+ ]
+ },
+ {
+ "path": "scheduler/__main__.py",
+ "content": [
+ "print('ok')"
+ ]
+ }
+ ],
+ "failure_log": [
+ "Error: No file/folder found for package scheduler"
+ ],
+ "build": {
+ "command": "docker build -t sabnock/sbd-0108 ."
+ },
+ "verify": {
+ "commands": [
+ "docker build -t sabnock/sbd-0108 ."
+ ]
+ },
+ "oracle_patch": [
+ "--- a/Dockerfile",
+ "+++ b/Dockerfile",
+ "@@ -2,6 +2,6 @@",
+ " WORKDIR /app",
+ " RUN pip install --no-cache-dir poetry==1.8.3",
+ " COPY pyproject.toml ./",
+ "-RUN poetry install --only main",
+ "+RUN poetry install --only main --no-root",
+ " COPY scheduler ./scheduler",
+ " CMD [\"poetry\", \"run\", \"python\", \"-m\", \"scheduler\"]"
+ ],
+ "scoring": {
+ "must_touch": [
+ "Dockerfile"
+ ],
+ "must_contain": [
+ {
+ "path": "Dockerfile",
+ "text": "poetry install --only main --no-root"
+ }
+ ],
+ "must_not_contain": []
+ }
+ }
+]