문제 해결
문제 해결 (Troubleshooting)
Docker Agent를 사용할 때 겪는 일반적인 문제와 해결 방법을 알려드릴게요.
출처: 문서
본문
일반적인 오류 (Common Errors)
컨텍스트 창 초과 (Context Window Exceeded)
에러 메시지: context_length_exceeded 또는 유사한 것.
- TUI에서
/compact를 사용해 대화 기록을 요약하고 줄이기 - 에이전트 구성에서
num_history_items를 설정해 모델로 보내는 메시지 수를 제한 - 더 큰 컨텍스트를 가진 모델로 전환 (Claude Sonnet 4.5는 1M 토큰, Gemini는 최대 2M 지원)
- 큰 작업을 더 작은 대화로 나누기
최대 반복 횟수 도달 (Max Iterations Reached)
에이전트가 작업을 완료하지 못한 채 max_iterations 한도에 도달했어요.
- 에이전트 구성에서
max_iterations를 늘리기 (기본값은 무제한이지만, 많은 에이전트가 20~50으로 설정) - 에이전트가 루프에 빠졌는지 확인 (
--debug를 켜서 도구 호출 확인) - 복잡한 작업을 더 작은 단계로 나누기
모델 폴백 발생 (Model Fallback Triggered)
기본 모델이 실패하면 Docker Agent는 자동으로 폴백 모델로 전환해요. "Switching to fallback model" 같은 로그 메시지를 찾아보세요.
- 429 에러: Rate limiting(요청 제한) — 쿨다운 기간 동안 폴백을 계속 사용
- 5xx 에러: 서버 문제 — 지수 백오프로 재시도한 뒤 폴백
- 4xx 에러: 클라이언트 오류 — 바로 다음 모델로 건너뜀
에이전트 구성에서 폴백 동작을 구성해요:
agents:
root:
model: anthropic/claude-sonnet-4-5
fallback:
models: [openai/gpt-5-mini, openai/gpt-4o-mini]
retries: 2 # retries per model for 5xx errors
cooldown: 1m # how long to stick with fallback after 429
자격 증명이나 모델 오류 누락 (Missing credentials or model errors)
Docker Agent가 시작 시 사용 가능한 모델을 찾지 못하면 실행 가능한 에러와 함께 빠르게 실패해요. 이 메시지는 정확한 다음 단계를 알려줘요. docker agent doctor 는 전체 그림을 볼 수 있는 가장 빠른 방법이에요 — 어떤 제공자에 자격 증명이 있는지, Docker Model Runner에 접근 가능한지, auto 가 어떤 모델을 선택할지 등을요.
필수 환경 변수가 설정되지 않음 (Required environment variables not set)
에이전트(또는 그것이 사용하는 도구)가 구성되지 않은 환경 변수에 의존하고 있어요:
The following environment variables must be set:
- ANTHROPIC_API_KEY
Provide them using any of these sources:
- Shell environment: export ANTHROPIC_API_KEY=<value>
- Env file: docker agent run --env-from-file <file> ...
- Docker Agent env file: docker agent setup (stores the key in ~/.config/cagent/.env)
See https://docs.docker.com/ai/docker-agent/guides/secrets/ for details.
나열된 시크릿 소스 중 아무거나 통해 변수를 설정해요. 누락된 변수가 모델 제공자 API 키일 때는, 에러에서 API 키가 필요 없는 로컬 모델(docker agent run --model dmr/ai/qwen3 ...)을 대신 실행하라고 제안하며 Set Up a Model 튜토리얼로 연결해줘요.
사용 가능한 모델 없음 (auto 선택 실패) — No model available (auto selection failed)
auto 모델 선택기가 구성된 클라우드 제공자도, 사용 가능한 Docker Model Runner 모델도 찾지 못했어요:
No model is currently available.
To fix this, you can:
- Pull a Docker Model Runner model, e.g. `docker model pull ai/qwen3`
- Install Docker Model Runner: https://docs.docker.com/ai/model-runner/get-started/
- Configure an API key for a cloud provider:
- anthropic: ANTHROPIC_API_KEY
- openai: OPENAI_API_KEY
...
클라우드 제공자 API 키를 구성하거나(아래 API keys not set 참고), 로컬 모델을 풀하면 돼요. Set Up a Model 튜토리얼이 두 경로를 모두 안내해요. docker agent doctor 를 실행하면 어떤 제공자에 자격 증명이 있고 Docker Model Runner에 접근 가능한지 확인할 수 있어요.
Docker Model Runner 모델이 풀되지 않음 (Docker Model Runner model not pulled)
dmr/... 모델을 요청했지만 로컬에 없어요:
model ai/qwen3 is not pulled in Docker Model Runner
To resolve this, you can:
- Pull it first: docker model pull ai/qwen3
- Or choose a model that is already available (see `docker model ls`).
대신 cannot query Docker Model Runner at <url> 이 보이면, Docker Model Runner가 설치되지 않았거나 실행 중이지 않은 거예요 — Model Runner get-started 가이드를 참고하세요.
Tip 실행 전에 진단하기 (Diagnose before you run)
docker agent doctor(또는docker agent doctor ./agent.yaml로 파일의 요구 사항 포함)를 실행하면 세 가지 문제를 한 번에 확인해요. 실행을 막을 무언가가 있으면 0이 아닌 코드로 종료되어 CI 프리플라이트로 유용해요. CLI reference 참고.
디버그 모드 (Debug Mode)
어떤 문제든 첫 단계는 디버그 로깅을 켜는 거예요. 그러면 Docker Agent가 내부적으로 뭘 하는지 자세한 정보를 얻을 수 있어요.
# Enable debug logging (writes to ~/.cagent/cagent.debug.log)
$ docker agent run config.yaml --debug
# Write debug logs to a custom file
$ docker agent run config.yaml --debug --log-file ./debug.log
# Enable OpenTelemetry tracing for deeper analysis
$ docker agent run config.yaml --otel
Tip 이슈를 보고할 때는 항상
--debug를 켜세요. 로그 파일에는 API 호출, 도구 실행, 에이전트 상호작용의 상세한 트레이스가 들어 있어요.
에이전트가 응답하지 않음 (Agent Not Responding)
API 키가 설정되지 않음 (API keys not set)
각 모델 제공자는 환경 변수로 자체 API 키를 요구해요:
| Provider | Environment Variable |
|---|---|
| OpenAI | OPENAI_API_KEY |
| Anthropic | ANTHROPIC_API_KEY |
| Google Gemini | GOOGLE_API_KEY or GEMINI_API_KEY |
| Mistral | MISTRAL_API_KEY |
| xAI | XAI_API_KEY |
| Nebius | NEBIUS_API_KEY |
| MiniMax | MINIMAX_API_KEY |
| Requesty | REQUESTY_API_KEY |
| OpenRouter | OPENROUTER_API_KEY |
| GitHub Copilot | GITHUB_TOKEN (copilot scope가 있는 PAT) |
| Azure OpenAI | AZURE_API_KEY (token_key 로 재정의) |
| AWS Bedrock | AWS_BEARER_TOKEN_BEDROCK 또는 AWS 자격 증명 체인 |
# Verify your keys are set
$ env | grep API_KEY
잘못된 모델 이름 (Incorrect model name)
모델 이름은 제공자의 명명과 정확히 일치해야 해요. 흔한 실수:
- 더 이상 사용되지 않는 모델 이름 사용 (예:
gpt-4대신gpt-5-mini나gpt-4o) - 모델 참조는 대소문자를 구분해요:
openai/gpt-5-mini≠openai/GPT-5-mini
네트워크 연결 (Network connectivity)
에이전트가 멈추거나 타임아웃되면 제공자의 API 엔드포인트에 도달할 수 있는지 확인해요. 방화벽, VPN, 프록시 설정이 요청을 차단할 수 있어요.
도구 실행 실패 (Tool Execution Failures)
MCP 도구를 찾지 못하거나 실패함 (MCP tools not found or failing)
- MCP 도구 명령이 설치되어 있고 PATH에 있는지 확인
- 파일 권한 확인 — 도구는 실행 가능해야 해요
- Docker Agent와 통합하기 전에 MCP 도구를 독립적으로 테스트
- Docker 기반 MCP 도구(
ref: docker:*)는 Docker Desktop이 실행 중인지 확인
파일시스템 / 셸 도구 오류 (Filesystem / shell tool errors)
- 에이전트에 올바른 toolset이 구성되어 있는지 확인 (
type: filesystem,type: shell) - 작업 디렉터리가 존재하고 접근 가능한지 확인
- macOS에서는 터미널에 필요한 권한(예: Full Disk Access)이 있는지 확인
도구 수명 주기 문제 (Tool lifecycle issues)
MCP와 LSP toolset은 슈퍼바이저가 관리하며, 크래시하거나 세션을 잃으면 자동으로 재시작해요. TUI는 그 슈퍼바이저를 두 개의 슬래시 명령으로 노출해요:
/tools— 통합된 도구 대화상자. 상단 섹션은 각 toolset을 현재 상태(Stopped,Starting,Ready,Degraded,Restarting,Failed), 재시작 횟수, 마지막 에러와 함께 나열하고, 하단 섹션은 에이전트가 호출할 수 있는 모든 도구를 나열해요. 도구가 없거나 멈춘 것처럼 보이면 여기부터 시작하세요./toolset-restart <name>— 이름 있는 toolset의 슈퍼바이저 주도 재연결을 강제해요. OAuth를 완료한 후, 원격 MCP 서버를 재배포한 후, 또는gopls같은 언어 서버가 응답하지 않을 때 유용해요.
401 invalid_token 을 반환하는 원격 MCP 서버(예: 저장된 OAuth 토큰이 취소되거나 회전된 경우)는 이제 자가 치유돼요: Docker Agent는 가능하면 조용히 refresh token을 새 것으로 교환하고, 불가능하면 다음 메시지에서 OAuth 재인증 프롬프트를 표시해요. 프로세스 재시작이 필요한 멈춘 toolset은 더 이상 없어요 — 단, 즉시 재인증하고 싶다면 /toolset-restart <name> 이 바로 강제해요.
stdio 전송을 사용하는 MCP 도구는 사용 가능해지기 전에 초기화 핸드셰이크를 완료해야 해요. 도구가 조용히 실패하면:
/tools를 실행해 toolset이Failed이거나Restarting에 갇혀 있는지, 마지막 에러가 무엇인지 확인--debug를 켜고 로그에서 MCP 프로토콜 메시지 찾기- MCP 서버 프로세스가 시작되고
initialize에 응답하는지 확인 - 도구가 요구하는 환경 변수가 설정되어 있는지 확인 (
env와env_file을 toolset 구성에서 확인)
Note 시작 시 도구 목록 타임아웃 (Startup tool-listing timeout) 시작할 때 Docker Agent는 각 toolset에 도구 목록을 질의해요. toolset이 10초 내에 응답하지 않으면(예:
tools/list에 응답하지 않는 웨지된 MCP stdio 서버), 해당 toolset은 경고와 함께 건너뛰고 나머지 toolset은 정상적으로 로드돼요. 사이드바는 로드된 도구들을 보여주며 해결돼요 — 무한 스피너는 없어요.--debug로 경고 메시지를 확인하고, 서버가 응답하게 되면/toolset-restart <name>을 사용하세요.
toolset이 빡빡한 루프에서 계속 크래시하면 toolset의 lifecycle 블록을 조정해요(예: backoff.initial 을 높이거나, max_restarts 를 낮추거나, best-effort 프로필로 전환) — 그래서 불안정한 의존성이 재시작 폭풍으로 증폭되지 않게 해요.
구성 오류 (Configuration Errors)
YAML 구문 문제 (YAML syntax issues)
Docker Agent는 시작 시 구성을 검증하고 줄 번호와 함께 에러를 보고해요. 흔한 문제:
- 잘못된 들여쓰기 (YAML은 공백에 민감함)
- 특수 문자(
:,#,{,})를 포함한 값 주위에 따옴표 누락 - 공백 대신 탭 사용
누락된 참조 (Missing references)
sub_agents의 로컬 에이전트는agents섹션에 정의되어야 해요 (외부 OCI 참조인myorg/agent:tag는 레지스트리에서 자동으로 해석됨)- 이름 있는 모델 참조는
models섹션에 존재해야 해요 (또는openai/gpt-5같은 인라인 형식 사용) - 에이전트가 참조하는 RAG 소스 이름은
rag섹션에 정의되어야 해요
Toolset 검증 (Toolset validation)
path필드는 memory와 tasks toolset, 그리고 에이전트 레벨cache블록에 유효해요- MCP toolset은
command(stdio),remote(Streamable HTTP/SSE),ref(Docker) 중 하나가 필요해요 - 제공자 이름은
openai,anthropic,google,amazon-bedrock,dmr등 중 하나여야 해요
Note 스키마 검증 (Schema Validation) 편집기에서 JSON 스키마를 사용하면 실시간 구성 검증과 자동 완성을 얻을 수 있어요.
세션 및 연결 문제 (Session & Connectivity Issues)
새 데이터베이스 에러로 다운그레이드 실패 (Downgrade fails with a newer-database error)
업그레이드 후 이전 Docker Agent 바이너리가 세션 데이터베이스를 열지 못하면, 데이터베이스에 이전 바이너리가 모르는 스키마 마이그레이션이 포함된 것일 수 있어요. 이전 버전이 만든 데이터베이스를 복원하거나, 마이그레이션을 포함한 바이너리를 사용하세요.
포트 충돌 (Port conflicts)
Docker Agent를 API 서버나 MCP 서버로 실행할 때 포트가 이미 사용 중이지 않은지 확인해요:
# Check if port 8080 is in use
$ lsof -i :8080
# Use a different port
$ docker agent serve api config.yaml --listen :9090
MCP 엔드포인트 접근성 (MCP endpoint accessibility)
원격 MCP 서버의 경우 엔드포인트에 도달 가능한지 확인해요:
# Test streamable HTTP endpoint
$ curl -v https://mcp-server.example.com/mcp
세션 격리 (Session isolation)
API 서버는 모든 대화를 SQLite 데이터베이스(session.db, 기본값)에 별개의 세션으로 저장해요. 각 세션은 UUID로 식별되며, 같은 세션 ID가 재사용될 때만 메시지가 섞여요. 대화가 서로 섞이는 것 같으면:
- 각 클라이언트가
POST /api/sessions로 새 세션을 만들도록 해요 (사용자 간에 세션 ID를 재사용하지 마세요). --session-db가 예상 경로를 가리키는지 확인 — 다른 실행의 오래된 데이터베이스가 이전 세션을 다시 드러낼 수 있어요.GET /api/sessions/:id로 실제 저장된 내용을 검사하고, 더 원하지 않는 세션은DELETE /api/sessions/:id로 지우세요.
HTTP 413: 요청 본문이 너무 큼 (HTTP 413: request body too large)
세 종류의 프로세스가 과도하게 큰 요청 본문을 413 Request Entity Too Large 로 거부해요: docker agent serve api, docker agent serve chat, 그리고 대화형 실행의 컨트롤 플레인(docker agent run --listen). 이들은 똑같이 구성되지 않아요: serve api 와 serve chat 는 각각 자체 --max-request-size 플래그(기본 1 MiB)를 노출해요. --listen 컨트롤 플레인에는 그런 플래그가 없어요 — 고정되고 구성할 수 없는 1 MiB 한도를 적용해요 — 그리고 --auth-token 도 없어요. 이 레이어들을 순서대로 살펴보세요:
- 어떤 서버가 관여했는지 파악해요.
serve api,serve chat, 그리고 연결된 실행의--listen컨트롤 플레인은 세 가지 별개의 프로세스 종류예요.serve api와serve chat는 각각 자체--max-request-size플래그와 1 MiB 기본값을 가져요 — 413을 반환한 프로세스가 실제로 어떤 플래그로 시작됐는지 확인해요.--listen컨트롤 플레인에는--max-request-size플래그가 없어요: 그 1 MiB 상한은 고정이에요. - 직렬화된 요청 본문을 측정해요, 소스 파일 크기가 아니라. JSON 문자열 이스케이프와 base64로 인코딩된 바이너리 콘텐츠의 base64 ~33% 확장은 둘 다 와이어 크기를 원래 파일 크기보다 훨씬 부풀려요 — 한도 바로 아래의 파일도 인코딩된 요청을 넘길 수 있어요.
- 중간자를 배제해요. Docker Agent 앞에 역방향 프록시, 게이트웨이, 로드 밸런서가 있다면 보통 자체적이고 독립적인 본문 크기 한도를 적용하며(종종 다른 형식의 에러로), Docker Agent가 보기 전에 요청을 거부할 수 있어요.
- 실제로 누가 에러를 반환했는지 확인해요. 413(또는 컨텍스트 길이 에러)은 요청이 도달한 뒤 모델 제공자 자체에서도 올 수 있어요; 그것은
--max-request-size와 무관한 별개의 한도예요 — 위의 Context Window Exceeded 참고. - 해결해요. Docker Agent 자체 서버가 요청을 거부했음을 확인했다면, 콘텐츠를 덜 보내요 — 턴에 걸쳐 나누세요.
serve api나serve chat에서는 의도적으로 더 큰--max-request-size로 서버를 재시작할 수도 있어요(API Server 또는 Chat Server 참고).--listen컨트롤 플레인에는 올릴--max-request-size플래그가 없어요 — 콘텐츠를 덜 보내는 것만이 해결책이에요.
사람들을 당황시키는 몇 가지:
--max-request-size는 프로세스 시작 시 한 번 설정되고 그 서버가 처리하는 모든 요청에 적용돼요 — 요청별 또는 클라이언트별이 아니에요. 오직serve api와serve chat만 그것을 가지며,--listen컨트롤 플레인의 1 MiB 상한은 바꿀 수 없어요.0이나 음수 값은 1 MiB 기본값으로 폴백돼요; "제한 없음"을 뜻하지 않아요.- 같은 서버에 같은 과대 본문을 재시도해도 성공하지 않아요 — 요청 사이에 한도가 바뀌지 않아요.
- 셋 모두에서 본문 크기 검사는 요청 인증보다 앞서 실행되므로, 과대 요청은 유효한 자격 증명 없이도 413로 돌아올 수 있어요.
- 로컬 실행에 stdin을 파이프하는 것(
docker agent run agent.yaml -)은 Docker Agent 자신의 인바운드 HTTP 경계를 넘지 않아요 — Docker Agent는 여전히 그 콘텐츠를 HTTP로 모델/제공자에게 보낼 수 있지만,--max-request-size상한에 대해 측정될 Docker Agent 자신의 서버에 도달하는 요청은 없어요. 그러나docker agent run --remote ... -에 stdin을 파이프하는 것은 그 경계를 넘어요: CLI가 그 stdin 텍스트를 네이티브 API 실행 요청으로 직렬화하고,--remote주소가 가리키는 Docker Agent 서버 —serve api프로세스 또는 다른 실행의--listen컨트롤 플레인, 다른 프로토콜을 쓰는serve chat는 절대 아님 — 로 보내므로, 다른 요청처럼 그 서버 자체의 한도(serve api는 구성 가능한--max-request-size,--listen컨트롤 플레인은 고정 1 MiB 상한)에 대해 측정돼요. 그 초기 요청은 메시지 텍스트만 실어요 — 현재 변환은 첫 메시지에 대해 로컬로 해결된 첨부 파일(@path,/attach,--attach)을 버리므로, 그것 단독으로는 413의 원인이 될 수 없어요. 하지만--remote실행이 전체 수명 동안 텍스트 전용으로 머무르지 않아요: 에이전트가 바쁜 동안 나중 메시지에 추가된 로컬로 해결된 첨부 파일 — 기본 steer 동작이나 명시적 후속 조치(Alt+Enter)를 통해 — 이 네이티브 API 요청의 일부로 전달되고, 같은 한도에 포함되며, 다른 과대 요청처럼 413을 유발할 수 있어요.
Warning
--max-request-size를 올리면 인증되지 않거나 악의적인 클라이언트가 서버가 요청당 버퍼링하도록 강제할 수 있는 메모리 양이 늘어나요. 배포의 노출 수준을 고려해 값을 선택하고, 루프백이 아닌 리스너에는--auth-token(API 서버) 또는--api-key/--api-key-env(챗 서버)를 짝지어주세요.--listen컨트롤 플레인에는 두 플래그가 모두 없어요 — 다른 곳에서 접근 가능해야 한다면 루프백, 유닉스 소켓, 또는 인증하는 역방향 프록시 뒤에 유지하세요.
성능 문제 (Performance Issues)
높은 메모리 사용량 (High memory usage)
- 큰 컨텍스트 창(64K+ 토큰)은 상당한 메모리를 소비해요 —
max_tokens를 줄이는 것을 고려 - 에이전트 구성에서
num_history_items를 사용해 대화 기록을 제한 - DMR(로컬 모델)의 경우 하드웨어에 맞게
runtime_flags를 조정 (예: GPU 레이어용--ngl)
느린 응답 (Slow responses)
- MCP 도구가 지연을 더하고 있는지 확인 (debug 로그에서 볼 수 있음)
- TUI에서
/cost명령을 사용해 토큰 사용량을 보고 비싼 상호작용을 파악 - DMR의 경우 더 빠른 추론을 위해 추측 디코딩(speculative decoding) 활성화를 고려
도구 리소스 누수 (Tool resource leaks)
제대로 정리하지 않는 도구를 모니터링해요 — MCP 서버 시작/중지 수명 주기 이벤트에 대해 debug 로그를 확인하세요. 고아(orphan) 도구 프로세스가 시스템 리소스를 소비할 수 있어요.
에이전트 스토어 문제 (Agent Store Issues)
Pull / push 실패 (Pull / push failures)
# Test registry connectivity
$ docker pull docker.io/username/agent:latest
# Verify pulled agent content
$ docker agent share pull docker.io/username/agent:latest
에이전트 콘텐츠 문제 (Agent content issues)
- 푸시된 YAML이 유효한지 확인 — 푸시 전에 로컬에서
docker agent run실행 - 참조된 리소스(MCP 도구, 파일)가 대상 머신에 있는지 확인
- 자동 새로고침(
--pull-interval)의 경우 서버에서 레지스트리에 접근 가능한지 확인
로그 분석 (Log Analysis)
debug 로그를 검토할 때 다음 키 패턴을 찾아보세요:
| Log Pattern | What It Indicates |
|---|---|
| "Starting runtime stream" | 에이전트 실행 시작 |
| "Tool call" | 도구가 실행 중 |
| "Tool call result" | 도구 실행 완료 |
| "Stream stopped" | 에이전트 처리 완료 |
| HTTP 429 | Rate limiting — 폴백 모델 추가를 고려 |
context canceled |
작업이 중단됨 (타임아웃 또는 사용자 취소) |
| [RAG Manager] | RAG 검색 작업 |
| [Reranker] | 재랭킹 작업 |
Warning 여전히 막혔나요? 이 단계로도 해결되지 않으면 GitHub issue tracker에 debug 로그를 첨부해 버그를 등록하거나, Slack 에서 물어보세요.