본문 바로가기
서버, 인프라

Docker 안에서 Claude Code, Codex 쓰다가 git push 막힌 분들 보세요

by 요즘IT 2026. 6. 3.

git push 날렸는데 이런 거 본 적 있죠?

 
 
text
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 파일로 만들어뒀어요.

 
 
bash
# claudeRun.sh
docker exec -it claude-code bash

# codexRun.sh
docker exec -it codex bash

서버에서 bash claudeRun.sh 치면 Claude Code 컨테이너 안으로 바로 들어가는 구조예요.

근데 여기서 문제가 생기거든요.

컨테이너 안에서 git push 하면, 컨테이너는 SSH 키를 모르니까 GitHub 인증에서 막혀요.

Docker container SSH key mount diagram
Docker container SSH key mount diagram


해결 방법은 SSH 키를 컨테이너에 물려주는 거예요

STEP 1. 호스트 서버에 SSH 키 만들기

여기서 잠깐, 헷갈리는 부분이 있어요.

docker exec -it claude-code bash로 접속한 상태는 컨테이너 안이에요. 프롬프트가 이렇게 생겼죠.

 
 
bash
root@a1b2c3d4e5f6:/#   ← 컨테이너 안

SSH 키는 여기서 만들면 안 돼요. 컨테이너가 재시작되면 날아가거든요.

호스트 서버에서 만들어야 해요. 이 프롬프트 상태에서요.

 
 
bash
root@ubuntu-8gb-hel1-1:~#   ← 호스트 서버
 
 
bash
ssh-keygen -t ed25519 -C "your@email.com"

경로, 패스워드 전부 그냥 엔터 치면 돼요.

생성된 공개키 확인:

 
 
bash
cat ~/.ssh/id_ed25519.pub

이걸 복사해서 GitHub → Settings → SSH and GPG keys → New SSH key에 붙여넣기.


STEP 2. GitHub 연결 확인

 
 
bash
ssh -T git@github.com

이게 나오면 성공이에요.

 
 
text
Hi username! You've successfully authenticated,
but GitHub does not provide shell access.

STEP 3. 기존 컨테이너 확인

SSH 키를 마운트하려면 컨테이너를 새로 띄워야 해요.

docker restart로는 안 돼요. 마운트 옵션은 컨테이너 처음 실행할 때만 적용되거든요.

먼저 지금 컨테이너에 SSH 마운트가 돼 있는지 확인해요.

 
 
bash
docker inspect claude-code | grep ssh

뭔가 나오면 이미 마운트된 거예요. 아무것도 안 나오면 새로 띄워야 해요.


STEP 4. 컨테이너 내렸다가 새로 올리기

 
 
bash
docker stop claude-code
docker rm claude-code

그다음 SSH 마운트 옵션 추가해서 새로 실행.

 
 
bash
docker run -dit \
  --name claude-code \
  -v /opt/workspace:/workspace \
  -v ~/.ssh:/root/.ssh:ro \
  -w /workspace \
  claude-code

Codex도 똑같이.

 
 
bash
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 등록

컨테이너 안에 들어가서 한 번만 실행해줘요.

 
 
bash
# 컨테이너 접속
docker exec -it claude-code bash

# 안에서 실행
ssh-keyscan github.com >> ~/.ssh/known_hosts

이거 안 하면 키가 있어도 Host key verification failed 뜨는 경우가 있어요.


STEP 6. 컨테이너 안에서 push 확인

 
 
bash
ssh -T git@github.com
 
 
text
Hi username! You've successfully authenticated

나오면 이제 Claude Code가 git push까지 자동으로 돌아가요.

호스트 SSH 키 → 컨테이너 마운트 → GitHub 인증 흐름 다이어그램
호스트 SSH 키 → 컨테이너 마운트 → GitHub 인증 흐름 다이어그램


최종 구조 정리

 
 
bash
# claudeRun.sh — 접속용
docker exec -it claude-code bash

# codexRun.sh — 접속용
docker exec -it codex bash

컨테이너 실행은 SSH 마운트 포함해서 이렇게.

 
 
bash
# 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 문제로 막히는 일 없어요.