Files
Maxim 54ed0464ac docs(agentcore): stop the uv comment claiming the runtime env vars
The comment "Configure UV for container environment" sat above a six-variable
ENV block, but only three of those are uv settings. The other three are read by
completely unrelated consumers, and the comment silently claimed them:

  UV_COMPILE_BYTECODE / UV_LINK_MODE / UV_NO_CACHE  uv (confirmed via `uv help
      sync`, which lists all three as `[env: ...]` on uv 0.9.30)
  DOCKER_CONTAINER=1                                bedrock_agentcore runtime
  OTEL_PYTHON_LOG_CORRELATION=true                  opentelemetry logging
                                                    instrumentation
  PYTHONUNBUFFERED=1                                the CPython interpreter

DOCKER_CONTAINER is the dangerous one. In the installed tree it has two
consumers, not one:

  .venv/lib/python3.13/site-packages/bedrock_agentcore/runtime/app.py:402
      if os.path.exists("/.dockerenv") or os.environ.get("DOCKER_CONTAINER"):
          host = "0.0.0.0"  # nosec B104 - Docker needs this to expose the port
      else:
          host = "127.0.0.1"

  .venv/lib/python3.13/site-packages/bedrock_agentcore/identity/auth.py:163
      if os.getenv("DOCKER_CONTAINER") == "1":
          raise ValueError("Workload access token has not been set. ...")

(Line numbers are from the langgraph image, bedrock-agentcore 1.0.6. The strands
image pins 1.2.0, where the same two checks live at app.py:450 and auth.py:284.)
Both agents reach that first path: each builds a BedrockAgentCoreApp and calls
app.run().

The hazard: a reader who trusts the header and prunes "uv config" they don't
recognise unbinds the agent from 0.0.0.0, and nothing tells them. The bind check
is an `or` against /.dockerenv, which plain `docker run` creates -- so a local
smoke test still passes. AgentCore's managed runtime has no /.dockerenv, so the
breakage appears only once deployed. The HEALTHCHECK cannot catch it either: it
reaches the server over localhost from inside the container, which a
127.0.0.1-bound server answers happily.

Split the block into three ENV instructions, each under a comment describing
what actually reads those variables, so no variable's purpose is misattributed.

Two more instances of the same pattern, fixed in both files:
  - "Create non-root user" also covered the USER line beneath it, which switches
    to that user rather than creating it.
  - The strands file said "Copy agent code and shared utilities" above three
    COPYs, one of which is tools/. Now matches its langgraph twin.

This is comment-only. No environment variable, value, or ordering changed.

Verification, both images built for linux/arm64 from context
examples/integrations/agentcore:
  - `docker run --rm --platform linux/arm64 -e GATEWAY_CREDENTIAL_PROVIDER_NAME=dummy
    -e AWS_DEFAULT_REGION=us-east-1 <tag> sh -c 'env | sort'` before vs after is
    identical for both agents (modulo the per-container HOSTNAME).
  - `docker inspect -f '{{range .Config.Env}}...'` before vs after is identical
    for both agents including ordering, so the baked config is unchanged, not
    merely equivalent at runtime.
  - The DOCKER_CONTAINER claim was reproduced against the real code path with
    /.dockerenv masked and uvicorn.run stubbed: set -> host 0.0.0.0, unset ->
    host 127.0.0.1.
  - The HEALTHCHECK command was run against a 127.0.0.1-bound server inside the
    container and passed, confirming the failure mode is silent.
  - The two Dockerfiles are byte-identical modulo the agent name.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-24 17:50:50 +02:00
..