영구 스토리지 첨부하기
영구 스토리지 첨부하기
영구 볼륨을 마운트해 샌드박스가 삭제된 후에도 프로젝트 데이터를 보존해 봐요. 볼륨은 독립적인 리소스예요. 샌드박스를 삭제해도 볼륨은 삭제되지 않아요.
출처: 문서
본문
인증된 클라이언트, 이미지 등록과 관리 문서의 관리되는 이미지, 그리고 /workspace/data 같은 절대 마운트 경로로 시작하세요.
볼륨 만들기
생성 요청에 표시 이름과 멱등성 키를 선택하세요. 반환된 볼륨 이름(예: volumes/…)을 저장하세요. 그 이름이 이후 요청에서 볼륨을 식별해요. 표시 이름은 레이블일 뿐이에요.
핵심 코드:
return client.volumes.create(
{ displayName: name },
{ idempotencyKey: requestId },
);
완전한 TypeScript 예시: volumes/create.ts
import type { Sandboxes } from '@docker/sandboxes';
export async function createVolume(
client: Sandboxes,
name: string,
requestId: string,
) {
return client.volumes.create(
{ displayName: name },
{ idempotencyKey: requestId },
);
}
새 샌드박스에 마운트
샌드박스를 만들 때 볼륨 이름과 대상 경로를 제공하세요. 예시는 볼륨 이름에서 마운트 경로로의 맵을 받아 샌드박스가 실행될 때까지 기다려요. Cloud Sandboxes에서는 항목 하나를 제공하고 단독 첨부(exclusive attachment)를 사용하세요. 볼륨 접근은 계정에 활성화되어 있어야 해요. 메모리 스냅샷 이미지는 볼륨 첨부를 지원하지 않아요.
첨부는 샌드박스의 생성 설정에 속해요. 볼륨을 다른 곳에 마운트하려면 첨부로 다른 샌드박스를 만드세요. 단독 첨부에서는 볼륨을 다른 샌드박스에 첨부하기 전에 첫 번째 샌드박스를 해제하세요. 겹치는 마운트 경로는 피하세요.
마운트 경로 아래에 파일을 쓰고, 샌드박스를 삭제하고, 볼륨을 새 샌드박스에 첨부해 다시 읽어 보세요. 마운트 밖의 파일은 샌드박스 자체 디스크에 남아요.
핵심 코드:
const sandbox = await client.create(
{
displayName: name,
image,
storage: {
volumes: [...mountPaths].map(([volume, target]) => ({
volume,
target,
})),
},
},
{ timeoutMs: 300_000, idempotencyKey: requestId },
);
return sandbox.waitUntilRunning();
완전한 TypeScript 예시: volumes/attach.ts
import type { Sandboxes } from '@docker/sandboxes';
export async function createWithVolumes(
client: Sandboxes,
name: string,
image: string,
mountPaths: Map<string, string>,
requestId: string,
) {
const sandbox = await client.create(
{
displayName: name,
image,
storage: {
volumes: [...mountPaths].map(([volume, target]) => ({
volume,
target,
})),
},
},
{ timeoutMs: 300_000, idempotencyKey: requestId },
);
return sandbox.waitUntilRunning();
}
볼륨 삭제
먼저 볼륨을 사용하는 샌드박스를 삭제한 다음 볼륨 핸들을 통해 볼륨을 삭제하세요. 서비스가 여전히 사용 중이라고 보고하면 샌드박스 삭제가 끝날 때까지 기다렸다가 재시도하세요.
볼륨 삭제는 그 콘텐츠를 영구적으로 제거해요. 보관하고 싶은 것은 복사해 두세요.
핵심 코드:
await volume.delete();
완전한 TypeScript 예시: volumes/delete.ts
import type { Volume } from '@docker/sandboxes';
export async function deleteVolume(volume: Volume) {
await volume.delete();
}