Troubleshooting the Docker workspace
Container setups fail in a small number of recognizable ways. The useful first move is almost always identifying which layer answered you, because the same blank page can come from the dev server, the relay, or the host port mapping.
Start with docker compose ps and the container logs. Then match your symptom
in the table below — most of these have one cause each, and guessing between
layers costs more time than checking.
Symptom map
| Symptom | Layer that owns it |
|---|---|
| The site does not load | The dev server, or the host port mapping |
| The console loads but no machine is online | Agent connection to the relay |
| The agent cannot find the project files | The working-directory setting, or the bind mount |
| Inference times out | Container egress — DNS, a VPN, or a proxy |
| A public address does not come up | Address provisioning or the outbound tunnel |
| Changes appear but no commit does | The project’s own agent instructions |
| A coding agent asks you to sign in again | The host login directory |
| Codex fails every command with a sandbox error | Codex’s inner sandbox |
First checks
docker compose ps
docker compose logs --tail 100Ports are worth knowing by heart, because “nothing is listening” and “the wrong thing is listening” look identical from a browser:
| Port | Meaning | Published by default |
|---|---|---|
8080 | Host URL for the site | Yes, loopback only |
5173 | The dev server inside the container | Reached through 8080 |
63141 | The console and its HTTP API | Yes, loopback only |
63142 | The relay’s machine listener | No, container-local |
If a surface is unreachable from another device on your network, that is the
default working as intended: both published ports bind to 127.0.0.1 until you
change HOST_BIND_ADDRESS deliberately.
The agent is offline after recreating the container
A recreated container is a new machine identity unless its state volume came with it. Check the console’s machine list for a stale duplicate rather than assuming the connection failed — the fix is usually removing the old entry, not restarting anything.
The agent cannot see the project
Two different causes look the same. Either the working directory does not point
where you think (CMDOP_AGENT_CWD), or the bind mount is not carrying the
files you expect. Confirm the second before adjusting the first:
docker compose exec demo ls -la /workspace/demoOn Linux, a bind mount that is present but unwritable is a user-id mismatch:
set HOST_UID and HOST_GID to the output of id -u and id -g, then
rebuild.
A coding agent asks you to sign in again
The login lives in the ./agents directory on the host, mounted into the
container. Being asked to sign in again means that directory did not arrive —
usually because the container was started from a different working directory,
or because the host directory is not writable by the container’s user.
The same user-id fix applies. A rebuild alone will not cause this: the whole point of keeping logins on the host is that rebuilds do not touch them.
Codex fails every command with a sandbox error
Codex sandboxes each command it runs, and containers frequently cannot create
the namespace that sandbox needs. CMDOP_CODEX_SANDBOX=auto detects this at
startup and falls back, so seeing this error usually means the sandbox was
pinned on explicitly.
Do not grant the container --privileged, seccomp=unconfined, or
SYS_ADMIN to make the inner sandbox work. That weakens the boundary
protecting your host in order to restore one protecting a directory inside a
disposable container. Set CMDOP_CODEX_SANDBOX=auto instead — see
coding agents.
Changes land but no commit appears
The demo project is its own isolated Git repository, and committing is instructed behavior rather than something the agent does implicitly. If a verification step fails, the agent is expected to leave the change uncommitted and say so — an absent commit is often a report you have not read yet, not a silent failure.
Two copies of a UI library
A page that dies on a hook call with a null error is almost always two copies of the same library resolved at once, typically after dependencies were installed both in the image and into the volume that shadows it. Rebuild without cache and let one copy win.
Collecting a support bundle
These are safe to share:
docker compose ps
docker compose logs --tail 200
docker compose exec demo cmdop --version
docker compose exec demo sh -lc 'claude --version; codex --version'Never include the agents/ directory or your .env in an issue or a support
bundle. Both hold live credentials.