dockerimg: switch to a debian base image

Developing on a musl-based alpine image seems to suck.
A lot of python stuff doesn't work.
Even when told it's alpine, LLMs still want to apt-get install things.

Along with switching to debian, simplify everything.
We *always* use debian bookwork now. If there are python
things, the LLM needs to install them on top of the model.
This will make fallback mode easier: if a build fails, then we
drop ExtraCmds and try again. (Future work.)

While here: avoid using docker buildx in tests because
it seems to vary a lot version-to-version.
diff --git a/dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr b/dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr
index 1f9688a..f3b15f6 100644
--- a/dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr
+++ b/dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr
@@ -1,9 +1,9 @@
 httprr trace v1
-3167 1729
+2637 1843
 POST https://api.anthropic.com/v1/messages HTTP/1.1

 Host: api.anthropic.com

 User-Agent: Go-http-client/1.1

-Content-Length: 2970

+Content-Length: 2440

 Anthropic-Version: 2023-06-01

 Content-Type: application/json

 

@@ -15,7 +15,7 @@
    "content": [
     {
      "type": "text",
-     "text": "\nCall the dockerfile tool to create a Dockerfile.\nThe parameters to dockerfile fill out the From and ExtraCmds\ntemplate variables in the following Go template:\n\n```\nFROM {{.From}}\n\nRUN apk add bash git make jq sqlite gcc musl-dev linux-headers npm nodejs go github-cli ripgrep fzf python3 curl vim grep\n\nENV GOTOOLCHAIN=auto\nENV GOPATH=/go\nENV PATH=\"$GOPATH/bin:$PATH\"\n\nRUN go install golang.org/x/tools/cmd/goimports@latest\nRUN go install golang.org/x/tools/gopls@latest\nRUN go install mvdan.cc/gofumpt@latest\n\nRUN mkdir -p /root/.cache/sketch/webui\n\nARG GIT_USER_EMAIL\nARG GIT_USER_NAME\n\nRUN git config --global user.email \"$GIT_USER_EMAIL\" \u0026\u0026 \\\n    git config --global user.name \"$GIT_USER_NAME\"\n\nLABEL sketch_context=\"{{.InitFilesHash}}\"\nCOPY . /app\n\nWORKDIR /app{{.SubDir}}\nRUN if [ -f go.mod ]; then go mod download; fi\n\n{{.ExtraCmds}}\n\nCMD [\"/bin/sketch\"]\n\n```\n\nIn particular:\n- Assume it is primarily a Go project. For a minimal env, prefer golang:1.24.2-alpine3.21 as a base image.\n- If any python is needed at all, switch to using a python alpine image as a the base and apk add go.\n  Favor using uv, and use one of these base images, depending on the preferred python version:\n    ghcr.io/astral-sh/uv:python3.13-alpine\n    ghcr.io/astral-sh/uv:python3.12-alpine\n    ghcr.io/astral-sh/uv:python3.11-alpine\n- When using pip to install packages, use: uv pip install --system.\n- Python env setup is challenging and often no required, so any RUN commands involving python tooling should be written to let docker build continue if there is a failure.\n- Include any tools particular to this repository that can be inferred from the given context.\n- Append || true to any apk add commands in case the package does not exist.\n- Do NOT expose any ports.\n- Do NOT generate any CMD or ENTRYPOINT extra commands.\nHere is the content of several files from the repository that may be relevant:\n\n"
+     "text": "\nCall the dockerfile tool to create a Dockerfile.\nThe parameters to dockerfile fill out the From and ExtraCmds\ntemplate variables in the following Go template:\n\n```\nFROM golang:1.24-bookworm\n\nRUN set -eux; \\\n\tapt-get update; \\\n\tapt-get install -y --no-install-recommends \\\n\t\tgit jq sqlite3 npm nodejs gh ripgrep fzf python3 curl vim\n\nENV PATH=\"$GOPATH/bin:$PATH\"\n\nRUN go install golang.org/x/tools/cmd/goimports@latest\nRUN go install golang.org/x/tools/gopls@latest\nRUN go install mvdan.cc/gofumpt@latest\n\nENV GOTOOLCHAIN=auto\n\nRUN mkdir -p /root/.cache/sketch/webui\n\nARG GIT_USER_EMAIL\nARG GIT_USER_NAME\n\nRUN git config --global user.email \"$GIT_USER_EMAIL\" \u0026\u0026 \\\n    git config --global user.name \"$GIT_USER_NAME\"\n\nCOPY . /app\n\nWORKDIR /app{{.SubDir}}\nRUN if [ -f go.mod ]; then go mod download; fi\n\n{{.ExtraCmds}}\n\nCMD [\"/bin/sketch\"]\n\n```\n\nIn particular:\n- Assume it is primarily a Go project.\n- Python env setup is challenging and often no required, so any RUN commands involving python tooling should be written to let docker build continue if there is a failure.\n- Include any tools particular to this repository that can be inferred from the given context.\n- Append || true to any apt-get install commands in case the package does not exist.\n- MINIMIZE the number of extra_cmds generated. Straightforward environments do not need any.\n- Do NOT expose any ports.\n- Do NOT generate any CMD or ENTRYPOINT extra commands.\nHere is the content of several files from the repository that may be relevant:\n\n"
     },
     {
      "type": "text",
@@ -39,14 +39,9 @@
    "input_schema": {
     "type": "object",
     "required": [
-     "from",
      "extra_cmds"
     ],
     "properties": {
-     "from": {
-      "type": "string",
-      "description": "The alpine base image provided to the dockerfile FROM command"
-     },
      "extra_cmds": {
       "type": "string",
       "description": "Extra commands to add to the dockerfile."
@@ -59,23 +54,23 @@
 Anthropic-Organization-Id: 3c473a21-7208-450a-a9f8-80aebda45c1b

 Anthropic-Ratelimit-Input-Tokens-Limit: 200000

 Anthropic-Ratelimit-Input-Tokens-Remaining: 200000

-Anthropic-Ratelimit-Input-Tokens-Reset: 2025-04-30T00:05:14Z

+Anthropic-Ratelimit-Input-Tokens-Reset: 2025-04-30T22:04:05Z

 Anthropic-Ratelimit-Output-Tokens-Limit: 80000

 Anthropic-Ratelimit-Output-Tokens-Remaining: 80000

-Anthropic-Ratelimit-Output-Tokens-Reset: 2025-04-30T00:05:16Z

+Anthropic-Ratelimit-Output-Tokens-Reset: 2025-04-30T22:04:08Z

 Anthropic-Ratelimit-Requests-Limit: 4000

 Anthropic-Ratelimit-Requests-Remaining: 3999

-Anthropic-Ratelimit-Requests-Reset: 2025-04-30T00:05:13Z

+Anthropic-Ratelimit-Requests-Reset: 2025-04-30T22:04:04Z

 Anthropic-Ratelimit-Tokens-Limit: 280000

 Anthropic-Ratelimit-Tokens-Remaining: 280000

-Anthropic-Ratelimit-Tokens-Reset: 2025-04-30T00:05:14Z

+Anthropic-Ratelimit-Tokens-Reset: 2025-04-30T22:04:05Z

 Cf-Cache-Status: DYNAMIC

-Cf-Ray: 9382c943fd3dcf26-SJC

+Cf-Ray: 938a55312bd8cf05-SJC

 Content-Type: application/json

-Date: Wed, 30 Apr 2025 00:05:16 GMT

-Request-Id: req_011CNdwTxraBdKm4MB7BcT13

+Date: Wed, 30 Apr 2025 22:04:08 GMT

+Request-Id: req_011CNfg371XDAe1Y9gVyKpwj

 Server: cloudflare

 Via: 1.1 google

 X-Robots-Tag: none

 

-{"id":"msg_01UMLT2D9zNEYPb6fdaHWepd","type":"message","role":"assistant","model":"claude-3-7-sonnet-20250219","content":[{"type":"text","text":"I'll help you generate a Dockerfile for your Go project. Based on the information provided, it's primarily a Go project without any specific Python requirements, so I'll use the preferred golang:1.24.2-alpine3.21 base image."},{"type":"tool_use","id":"toolu_01G9BDEwz2wgzWtzxE5Sb9mF","name":"dockerfile","input":{"from":"golang:1.24.2-alpine3.21","extra_cmds":"RUN apk add --no-cache bash git make jq sqlite gcc musl-dev linux-headers npm nodejs go github-cli ripgrep fzf python3 curl vim grep || true"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":4,"cache_creation_input_tokens":1047,"cache_read_input_tokens":0,"output_tokens":178}}
\ No newline at end of file
+{"id":"msg_01PkvGHd4a2yx34TunMEGznA","type":"message","role":"assistant","model":"claude-3-7-sonnet-20250219","content":[{"type":"text","text":"I'll help you create a Dockerfile for this Go project. Based on the template and the README.md, this appears to be a simple Go testing project. Since the project details are minimal, I'll keep the extra commands minimal as well."},{"type":"tool_use","id":"toolu_01PQ5Bzm1WMMfdUoYoF1YJpx","name":"dockerfile","input":{"extra_cmds":"RUN go install golang.org/x/tools/cmd/stringer@latest\n\n# Install any potentially useful development tools\nRUN apt-get install -y --no-install-recommends gcc build-essential make || true\n\n# Try to setup Python environment if needed\nRUN python3 -m pip install --upgrade pip || true"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":888,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":177}}
\ No newline at end of file