git push 날렸는데 이런 거 본 적 있죠?
Host key verification failed.
fatal: Could not read from remote repository.
저도 딱 이 상황이었어요.
Claude Code가 커밋까지는 멀쩡하게 만들었는데, push에서 뻗어버리는 거예요. 커밋은 됐는데 push가 안 되는 그 묘한 상황.
원인은 간단해요. Docker 컨테이너 안에 SSH 키가 없으니까요.
제 환경 먼저 설명할게요
서버는 Hetzner Ubuntu 기준이고, 이렇게 쓰고 있어요.
Claude Code랑 Codex, 둘 다 Docker 컨테이너로 올려놨고 /opt/workspace를 공유해서 같은 git 프로젝트를 바라보게 했어요.
접속은 이렇게 sh 파일로 만들어뒀어요.
# claudeRun.sh
docker exec -it claude-code bash
# codexRun.sh
docker exec -it codex bash
서버에서 bash claudeRun.sh 치면 Claude Code 컨테이너 안으로 바로 들어가는 구조예요.
근데 여기서 문제가 생기거든요.
컨테이너 안에서 git push 하면, 컨테이너는 SSH 키를 모르니까 GitHub 인증에서 막혀요.

해결 방법은 SSH 키를 컨테이너에 물려주는 거예요
STEP 1. 호스트 서버에 SSH 키 만들기
여기서 잠깐, 헷갈리는 부분이 있어요.
docker exec -it claude-code bash로 접속한 상태는 컨테이너 안이에요. 프롬프트가 이렇게 생겼죠.
root@a1b2c3d4e5f6:/# ← 컨테이너 안
SSH 키는 여기서 만들면 안 돼요. 컨테이너가 재시작되면 날아가거든요.
호스트 서버에서 만들어야 해요. 이 프롬프트 상태에서요.
root@ubuntu-8gb-hel1-1:~# ← 호스트 서버
ssh-keygen -t ed25519 -C "your@email.com"
경로, 패스워드 전부 그냥 엔터 치면 돼요.
생성된 공개키 확인:
cat ~/.ssh/id_ed25519.pub
이걸 복사해서 GitHub → Settings → SSH and GPG keys → New SSH key에 붙여넣기.
STEP 2. GitHub 연결 확인
ssh -T git@github.com
이게 나오면 성공이에요.
Hi username! You've successfully authenticated,
but GitHub does not provide shell access.
STEP 3. 기존 컨테이너 확인
SSH 키를 마운트하려면 컨테이너를 새로 띄워야 해요.
docker restart로는 안 돼요. 마운트 옵션은 컨테이너 처음 실행할 때만 적용되거든요.
먼저 지금 컨테이너에 SSH 마운트가 돼 있는지 확인해요.
docker inspect claude-code | grep ssh
뭔가 나오면 이미 마운트된 거예요. 아무것도 안 나오면 새로 띄워야 해요.
STEP 4. 컨테이너 내렸다가 새로 올리기
docker stop claude-code
docker rm claude-code
그다음 SSH 마운트 옵션 추가해서 새로 실행.
docker run -dit \
--name claude-code \
-v /opt/workspace:/workspace \
-v ~/.ssh:/root/.ssh:ro \
-w /workspace \
claude-code
Codex도 똑같이.
docker stop codex
docker rm codex
docker run -dit \
--name codex \
-v /opt/workspace:/workspace \
-v ~/.ssh:/root/.ssh:ro \
-w /workspace \
codex-cli
:ro는 read-only예요. 컨테이너가 키를 읽기만 하고 수정은 못 하게 막는 거예요.
STEP 5. known_hosts 등록
컨테이너 안에 들어가서 한 번만 실행해줘요.
# 컨테이너 접속
docker exec -it claude-code bash
# 안에서 실행
ssh-keyscan github.com >> ~/.ssh/known_hosts
이거 안 하면 키가 있어도 Host key verification failed 뜨는 경우가 있어요.
STEP 6. 컨테이너 안에서 push 확인
ssh -T git@github.com
Hi username! You've successfully authenticated
나오면 이제 Claude Code가 git push까지 자동으로 돌아가요.

최종 구조 정리
# claudeRun.sh — 접속용
docker exec -it claude-code bash
# codexRun.sh — 접속용
docker exec -it codex bash
컨테이너 실행은 SSH 마운트 포함해서 이렇게.
# Claude Code 실행
docker run -dit \
--name claude-code \
-v /opt/workspace:/workspace \
-v ~/.ssh:/root/.ssh:ro \
-w /workspace \
claude-code
# Codex 실행
docker run -dit \
--name codex \
-v /opt/workspace:/workspace \
-v ~/.ssh:/root/.ssh:ro \
-w /workspace \
codex-cli
솔직히 이게 제일 많이 막히는 구간이에요
AI 코딩 에이전트 서버에 올리는 글 많은데, SSH 인증까지 다루는 글은 잘 없더라고요.
근데 실제로 써보면 여기서 다 막혀요.
Claude Code가 코드 고치고 커밋까지 해놨는데 push에서 뻗으면, 결국 사람이 다시 들어와서 수동으로 push 해야 하거든요. 그게 좀 웃긴 상황이잖아요.
컨테이너 새로 띄우는 게 귀찮아 보여도, 한 번만 제대로 세팅해두면 그다음부터는 Claude Code든 Codex든 git push까지 알아서 돌아가요.
결국 핵심은 이거예요.
컨테이너는 격리된 환경이라 호스트 인증 정보를 모른다. 그래서 명시적으로 물려줘야 한다.
이거 한 번 세팅해두면 이후로 SSH 문제로 막히는 일 없어요.
'서버, 인프라' 카테고리의 다른 글
| Ubuntu 서버에 Claude Code + Codex 올려봤더니, 개발 방식이 달라졌어요 (0) | 2026.06.02 |
|---|---|
| [Claude 블로그 자동화] 블로그 글감 자동화 완성 — 수집부터 티스토리 발행까지 5편 (0) | 2026.05.31 |
| [Claude 블로그 자동화] nginx + certbot SSL 설정으로 도메인 연결하기 4편 (0) | 2026.05.30 |
| [Claude 블로그 자동화] Jenkins로 Docker 자동 배포 파이프라인 구축하기 3편 (0) | 2026.05.29 |
| [Claude 블로그 자동화] Ubuntu 서버에 Claude Code 도커로 올리기 1편 (0) | 2026.05.28 |