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": [] + } + } +]