Docker VM 런타임
GCP, Hetzner 등 VPS 기반 Docker 설치를 위한 공유 런타임 단계입니다.
이미지에 필수 바이너리 포함
실행 중인 컨테이너 안에 바이너리를 설치하는 것은 함정입니다. 런타임에 설치한 것은 재시작 시 모두 사라집니다.
스킬에 필요한 모든 외부 바이너리는 이미지 빌드 시점에 설치해야 합니다.
아래 예시는 세 가지 일반적인 바이너리만 보여줍니다:
gog— Gmail 접근용goplaces— Google Places용wacli— WhatsApp용
이것은 예시이며 전체 목록이 아닙니다. 같은 패턴으로 필요한 만큼의 바이너리를 설치할 수 있습니다.
나중에 추가 바이너리가 필요한 새 스킬을 추가하면 반드시:
- Dockerfile을 업데이트
- 이미지를 다시 빌드
- 컨테이너를 재시작
해야 합니다.
Dockerfile 예시
FROM node:24-bookworm
RUN apt-get update && apt-get install -y socat && rm -rf /var/lib/apt/lists/*
# Example binary 1: Gmail CLI
RUN curl -L https://github.com/steipete/gog/releases/latest/download/gog_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/gog
# Example binary 2: Google Places CLI
RUN curl -L https://github.com/steipete/goplaces/releases/latest/download/goplaces_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/goplaces
# Example binary 3: WhatsApp CLI
RUN curl -L https://github.com/steipete/wacli/releases/latest/download/wacli_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/wacli
# Add more binaries below using the same pattern
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN corepack enable
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
빌드 및 실행
docker compose build
docker compose up -d openclaw-gateway
pnpm install --frozen-lockfile 도중 Killed 또는 exit code 137로 빌드가 실패하면 VM의 메모리가 부족한 것입니다.
재시도 전에 더 큰 머신 클래스를 사용하세요.
바이너리 확인:
docker compose exec openclaw-gateway which gog
docker compose exec openclaw-gateway which goplaces
docker compose exec openclaw-gateway which wacli
예상 출력:
/usr/local/bin/gog
/usr/local/bin/goplaces
/usr/local/bin/wacli
게이트웨이 확인:
docker compose logs -f openclaw-gateway
예상 출력:
[gateway] listening on ws://0.0.0.0:18789
데이터 저장 위치
OpenClaw는 Docker에서 실행되지만, Docker가 데이터의 정본은 아닙니다. 모든 장기 보존 상태는 재시작, 리빌드, 재부팅에도 생존해야 합니다.
| 구성 요소 | 위치 | 유지 방식 | 비고 |
|---|---|---|---|
| 게이트웨이 설정 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | openclaw.json, 토큰 포함 |
| 모델 인증 프로필 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | OAuth 토큰, API 키 |
| 스킬 설정 | /home/node/.openclaw/skills/ | 호스트 볼륨 마운트 | 스킬 수준 상태 |
| 에이전트 워크스페이스 | /home/node/.openclaw/workspace/ | 호스트 볼륨 마운트 | 코드 및 에이전트 산출물 |
| WhatsApp 세션 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | QR 로그인 유지 |
| Gmail 키링 | /home/node/.openclaw/ | 호스트 볼륨 + 비밀번호 | GOG_KEYRING_PASSWORD 필요 |
| 외부 바이너리 | /usr/local/bin/ | Docker 이미지 | 빌드 시 포함 필수 |
| Node 런타임 | 컨테이너 파일시스템 | Docker 이미지 | 이미지 빌드마다 재생성 |
| OS 패키지 | 컨테이너 파일시스템 | Docker 이미지 | 런타임에 설치하지 마세요 |
| Docker 컨테이너 | 임시 | 재시작 가능 | 삭제해도 안전 |
업데이트
VM에서 OpenClaw를 업데이트하려면:
git pull
docker compose build
docker compose up -d