dockerimg: add emoji fonts to base image

Add emoji font packages to the Docker base image to support
emoji rendering in browser screenshots:

- fonts-noto-color-emoji: Color emoji font from Google
- fonts-symbola: Symbolic font with Unicode 9.0 emoji characters
- fc-cache -f -v: Force font cache refresh

This follows the typical Ubuntu emoji font installation pattern:
apt-get install -y fonts-noto-color-emoji && fc-cache -f -v

Co-Authored-By: sketch <hello@sketch.dev>
Change-ID: sea5a1179c771a14bk
diff --git a/dockerimg/testdata/testcreatedockerfile_empty_repo.httprr b/dockerimg/testdata/testcreatedockerfile_empty_repo.httprr
index 945fc06..8f370db 100644
--- a/dockerimg/testdata/testcreatedockerfile_empty_repo.httprr
+++ b/dockerimg/testdata/testcreatedockerfile_empty_repo.httprr
@@ -1,9 +1,9 @@
 httprr trace v1
-4955 2076
+5034 1792
 POST https://api.anthropic.com/v1/messages HTTP/1.1

 Host: api.anthropic.com

 User-Agent: Go-http-client/1.1

-Content-Length: 4758

+Content-Length: 4837

 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```\n# Stage 1: Get Chrome/Chromium from chromedp/headless-shell\nFROM docker.io/chromedp/headless-shell:stable AS chrome\n\n# Stage 2: Main application image\nFROM ubuntu:24.04\n\n# Switch from dash to bash by default.\nSHELL [\"/bin/bash\", \"-euxo\", \"pipefail\", \"-c\"]\n\n# attempt to keep package installs lean\nRUN printf '%s\\n' \\\n      'path-exclude=/usr/share/man/*' \\\n      'path-exclude=/usr/share/doc/*' \\\n      'path-exclude=/usr/share/doc-base/*' \\\n      'path-exclude=/usr/share/info/*' \\\n      'path-exclude=/usr/share/locale/*' \\\n      'path-exclude=/usr/share/groff/*' \\\n      'path-exclude=/usr/share/lintian/*' \\\n      'path-exclude=/usr/share/zoneinfo/*' \\\n    \u003e /etc/dpkg/dpkg.cfg.d/01_nodoc\n\n# Install system packages (removed chromium, will use headless-shell instead)\nRUN apt-get update; \\\n\tapt-get install -y --no-install-recommends \\\n\t\tca-certificates wget \\\n\t\tgit jq sqlite3 npm nodejs gh ripgrep fzf python3 curl vim lsof iproute2 less \\\n\t\tlibglib2.0-0 libnss3 libx11-6 libxcomposite1 libxdamage1 \\\n\t\tlibxext6 libxi6 libxrandr2 libgbm1 libgtk-3-0 \u0026\u0026 \\\n\tapt-get clean \u0026\u0026 \\\n\trm -rf /var/lib/apt/lists/* \u0026\u0026 \\\n\trm -rf /usr/share/{doc,doc-base,info,lintian,man,groff,locale,zoneinfo}/*\n\n# Install Go 1.24\nENV GO_VERSION=1.24.3\nENV GOROOT=/usr/local/go\nENV GOPATH=/go\nENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH\n\nRUN ARCH=$(uname -m) \u0026\u0026 \\\n\tcase $ARCH in \\\n\t\tx86_64) GOARCH=amd64 ;; \\\n\t\taarch64) GOARCH=arm64 ;; \\\n\t\t*) echo \"Unsupported architecture: $ARCH\" \u0026\u0026 exit 1 ;; \\\n\tesac \u0026\u0026 \\\n\twget -O go.tar.gz \"https://golang.org/dl/go${GO_VERSION}.linux-${GOARCH}.tar.gz\" \u0026\u0026 \\\n\ttar -C /usr/local -xzf go.tar.gz \u0026\u0026 \\\n\trm go.tar.gz\n\n# Create GOPATH directory\nRUN mkdir -p \"$GOPATH/src\" \"$GOPATH/bin\" \u0026\u0026 chmod -R 755 \"$GOPATH\"\n\n# While these binaries install generally useful supporting packages,\n# the specific versions are rarely what a user wants so there is no\n# point polluting the base image module with them.\n\nRUN go install golang.org/x/tools/cmd/goimports@latest; \\\n\tgo install golang.org/x/tools/gopls@latest; \\\n\tgo install mvdan.cc/gofumpt@latest; \\\n\tgo clean -cache -testcache -modcache\n\n# Copy the self-contained Chrome bundle from chromedp/headless-shell\nCOPY --from=chrome /headless-shell /headless-shell\nENV PATH=\"/headless-shell:${PATH}\"\n\nENV GOTOOLCHAIN=auto\nENV SKETCH=1\n\nRUN mkdir -p /root/.cache/sketch/webui\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\" \u0026\u0026 \\\n    git config --global http.postBuffer 524288000\n\nLABEL sketch_context=\"{{.InitFilesHash}}\"\nCOPY . /app\nRUN rm -f /app/tmp-sketch-dockerfile\n\nWORKDIR /app{{.SubDir}}\nRUN if [ -f go.mod ]; then go mod download; fi\n\n# Switch to lenient shell so we are more likely to get past failing extra_cmds.\nSHELL [\"/bin/bash\", \"-uo\", \"pipefail\", \"-c\"]\n\n{{.ExtraCmds}}\n\n# Switch back to strict shell after extra_cmds.\nSHELL [\"/bin/bash\", \"-euxo\", \"pipefail\", \"-c\"]\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.\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```\n# Stage 1: Get Chrome/Chromium from chromedp/headless-shell\nFROM docker.io/chromedp/headless-shell:stable AS chrome\n\n# Stage 2: Main application image\nFROM ubuntu:24.04\n\n# Switch from dash to bash by default.\nSHELL [\"/bin/bash\", \"-euxo\", \"pipefail\", \"-c\"]\n\n# attempt to keep package installs lean\nRUN printf '%s\\n' \\\n      'path-exclude=/usr/share/man/*' \\\n      'path-exclude=/usr/share/doc/*' \\\n      'path-exclude=/usr/share/doc-base/*' \\\n      'path-exclude=/usr/share/info/*' \\\n      'path-exclude=/usr/share/locale/*' \\\n      'path-exclude=/usr/share/groff/*' \\\n      'path-exclude=/usr/share/lintian/*' \\\n      'path-exclude=/usr/share/zoneinfo/*' \\\n    \u003e /etc/dpkg/dpkg.cfg.d/01_nodoc\n\n# Install system packages (removed chromium, will use headless-shell instead)\nRUN apt-get update; \\\n\tapt-get install -y --no-install-recommends \\\n\t\tca-certificates wget \\\n\t\tgit jq sqlite3 npm nodejs gh ripgrep fzf python3 curl vim lsof iproute2 less \\\n\t\tlibglib2.0-0 libnss3 libx11-6 libxcomposite1 libxdamage1 \\\n\t\tlibxext6 libxi6 libxrandr2 libgbm1 libgtk-3-0 \\\n\t\tfonts-noto-color-emoji fonts-symbola \u0026\u0026 \\\n\tfc-cache -f -v \u0026\u0026 \\\n\tapt-get clean \u0026\u0026 \\\n\trm -rf /var/lib/apt/lists/* \u0026\u0026 \\\n\trm -rf /usr/share/{doc,doc-base,info,lintian,man,groff,locale,zoneinfo}/*\n\n# Install Go 1.24\nENV GO_VERSION=1.24.3\nENV GOROOT=/usr/local/go\nENV GOPATH=/go\nENV PATH=$GOROOT/bin:$GOPATH/bin:$PATH\n\nRUN ARCH=$(uname -m) \u0026\u0026 \\\n\tcase $ARCH in \\\n\t\tx86_64) GOARCH=amd64 ;; \\\n\t\taarch64) GOARCH=arm64 ;; \\\n\t\t*) echo \"Unsupported architecture: $ARCH\" \u0026\u0026 exit 1 ;; \\\n\tesac \u0026\u0026 \\\n\twget -O go.tar.gz \"https://golang.org/dl/go${GO_VERSION}.linux-${GOARCH}.tar.gz\" \u0026\u0026 \\\n\ttar -C /usr/local -xzf go.tar.gz \u0026\u0026 \\\n\trm go.tar.gz\n\n# Create GOPATH directory\nRUN mkdir -p \"$GOPATH/src\" \"$GOPATH/bin\" \u0026\u0026 chmod -R 755 \"$GOPATH\"\n\n# While these binaries install generally useful supporting packages,\n# the specific versions are rarely what a user wants so there is no\n# point polluting the base image module with them.\n\nRUN go install golang.org/x/tools/cmd/goimports@latest; \\\n\tgo install golang.org/x/tools/gopls@latest; \\\n\tgo install mvdan.cc/gofumpt@latest; \\\n\tgo clean -cache -testcache -modcache\n\n# Copy the self-contained Chrome bundle from chromedp/headless-shell\nCOPY --from=chrome /headless-shell /headless-shell\nENV PATH=\"/headless-shell:${PATH}\"\n\nENV GOTOOLCHAIN=auto\nENV SKETCH=1\n\nRUN mkdir -p /root/.cache/sketch/webui\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\" \u0026\u0026 \\\n    git config --global http.postBuffer 524288000\n\nLABEL sketch_context=\"{{.InitFilesHash}}\"\nCOPY . /app\nRUN rm -f /app/tmp-sketch-dockerfile\n\nWORKDIR /app{{.SubDir}}\nRUN if [ -f go.mod ]; then go mod download; fi\n\n# Switch to lenient shell so we are more likely to get past failing extra_cmds.\nSHELL [\"/bin/bash\", \"-uo\", \"pipefail\", \"-c\"]\n\n{{.ExtraCmds}}\n\n# Switch back to strict shell after extra_cmds.\nSHELL [\"/bin/bash\", \"-euxo\", \"pipefail\", \"-c\"]\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.\n"
     },
     {
      "type": "text",
@@ -49,25 +49,25 @@
 }HTTP/2.0 200 OK

 Anthropic-Organization-Id: 3c473a21-7208-450a-a9f8-80aebda45c1b

 Anthropic-Ratelimit-Input-Tokens-Limit: 200000

-Anthropic-Ratelimit-Input-Tokens-Remaining: 182000

-Anthropic-Ratelimit-Input-Tokens-Reset: 2025-05-29T03:24:14Z

+Anthropic-Ratelimit-Input-Tokens-Remaining: 200000

+Anthropic-Ratelimit-Input-Tokens-Reset: 2025-05-29T22:37:58Z

 Anthropic-Ratelimit-Output-Tokens-Limit: 80000

 Anthropic-Ratelimit-Output-Tokens-Remaining: 80000

-Anthropic-Ratelimit-Output-Tokens-Reset: 2025-05-29T03:24:12Z

+Anthropic-Ratelimit-Output-Tokens-Reset: 2025-05-29T22:38:00Z

 Anthropic-Ratelimit-Requests-Limit: 4000

 Anthropic-Ratelimit-Requests-Remaining: 3999

-Anthropic-Ratelimit-Requests-Reset: 2025-05-29T03:24:07Z

+Anthropic-Ratelimit-Requests-Reset: 2025-05-29T22:37:57Z

 Anthropic-Ratelimit-Tokens-Limit: 280000

-Anthropic-Ratelimit-Tokens-Remaining: 262000

-Anthropic-Ratelimit-Tokens-Reset: 2025-05-29T03:24:12Z

+Anthropic-Ratelimit-Tokens-Remaining: 280000

+Anthropic-Ratelimit-Tokens-Reset: 2025-05-29T22:37:58Z

 Cf-Cache-Status: DYNAMIC

-Cf-Ray: 9472e08499f41761-SJC

+Cf-Ray: 94797aaf799eaab1-SJC

 Content-Type: application/json

-Date: Thu, 29 May 2025 03:24:12 GMT

-Request-Id: req_011CPb76HYjCbwZsnKLeSopG

+Date: Thu, 29 May 2025 22:38:00 GMT

+Request-Id: req_011CPcd5UL65ScG4jwsr7Rep

 Server: cloudflare

 Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

 Via: 1.1 google

 X-Robots-Tag: none

 

-{"id":"msg_01B9d191QEPfUmikqN6KAjxa","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[{"type":"text","text":"Looking at the template, this appears to be a Go project with Chrome/Chromium browser automation capabilities. The base template already includes comprehensive setup for Go development, Chrome headless browser, and common development tools.\n\nSince this is described as primarily a Go project and the template already provides:\n- Go 1.24.3 installation and configuration\n- Chrome/Chromium headless browser setup\n- Common development tools (git, npm, nodejs, etc.)\n- Go tooling (goimports, gopls, gofumpt)\n- Proper module downloading if go.mod exists\n\nNo additional extra commands are needed for a straightforward Go development environment."},{"type":"tool_use","id":"toolu_018ZT1mvTiaM5hQT6hBxrJ9c","name":"dockerfile","input":{"extra_cmds":""}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":4,"cache_creation_input_tokens":1710,"cache_read_input_tokens":0,"output_tokens":194,"service_tier":"standard"}}
\ No newline at end of file
+{"id":"msg_013JYrv4pyw4VhyqwMnU6uXF","type":"message","role":"assistant","model":"claude-sonnet-4-20250514","content":[{"type":"text","text":"Looking at this Go project template, I can see it's already well-configured with Go tooling, Chrome/Chromium for testing, and common development tools. Since this appears to be a straightforward Go project and the base template already includes comprehensive tooling (Go, git, ripgrep, fzf, python3, etc.), minimal extra commands are needed."},{"type":"tool_use","id":"toolu_01FjX7VTZJEzwmrU9nGWtiZJ","name":"dockerfile","input":{"extra_cmds":"RUN go mod tidy || true"}}],"stop_reason":"tool_use","stop_sequence":null,"usage":{"input_tokens":4,"cache_creation_input_tokens":1736,"cache_read_input_tokens":0,"output_tokens":139,"service_tier":"standard"}}
\ No newline at end of file