클라우드 샌드박스 계속 실행하기

클라우드 샌드박스 계속 실행하기

버려진 작업이 무한정 실행되지 않도록 샌드박스 수명을 설정하고, 만료될 때 어떤 일이 일어날지 선택해 봐요.

출처: 문서

본문

인증된 클라이언트와 관리되는 이미지가 필요해요. 같은 수명 주기 옵션을 키트 실행 시에도 제공할 수 있어요.

생성 시 수명 설정

SDK가 보여주는 단위로 수명을 전달하고 만료 동작을 선택하세요. 예시는 초를 받아 SDK의 기간 표현으로 변환해요.

중지는 샌드박스를 나중에 사용하기 위해 보존하고, 삭제는 제거해요. 여러분의 선택이 만료 후 애플리케이션이 샌드박스의 파일을 필요로 하는지와 일치하는지 확인하세요. 계정 제한이 허용된 기간과 동작을 제한할 수 있어요.

항상 켜짐(always-on) 접근이 있는 계정은 대신 restart 동작을 선택할 수 있어요. 이것은 자동 중지-재개 주기를 통해 메모리를 보존해요. 중지된 동안 동시성 예약을 유지하며, 들어오는 요청에 응답하는 재시작과는 달라요.

예시는 시작을 기다려요. 대기 마감은 샌드박스 수명과는 별개예요. 클라이언트 대기를 끝내도 샌드박스가 삭제되지 않아요.

핵심 코드:

const sandbox = await client.create(
  {
    displayName: name,
    image,
    lifecycle: {
      timeoutMs: lifeSeconds * 1_000,
      onTimeout: stopOnTimeout ? 'stop' : 'delete',
    },
  },
  { timeoutMs: 300_000, idempotencyKey: requestId },
);
return sandbox.waitUntilRunning();

완전한 TypeScript 예시: timeout/deadline.ts

import type { Sandboxes } from '@docker/sandboxes';

export async function createWithDeadline(
  client: Sandboxes,
  name: string,
  image: string,
  lifeSeconds: number,
  stopOnTimeout: boolean,
  requestId: string,
) {
  const sandbox = await client.create(
    {
      displayName: name,
      image,
      lifecycle: {
        timeoutMs: lifeSeconds * 1_000,
        onTimeout: stopOnTimeout ? 'stop' : 'delete',
      },
    },
    { timeoutMs: 300_000, idempotencyKey: requestId },
  );
  return sandbox.waitUntilRunning();
}

남은 수명 연장

renewTimeout()으로 샌드박스의 남은 수명을 연장해요. 기존 마감에 더할 증분이 아니라, 서비스가 갱신을 수락한 시점부터의 원하는 기간을 전달하세요. 갱신은 수명을 연장만 할 수 있고, 줄일 수는 없어요.

구성된 타임아웃을 만료 전에 갱신하세요. 호출이 실패하면 갱신이 적용되었다고 가정하지 말고 샌드박스의 현재 상태를 검사하세요.

서비스는 자동으로 재시작되는 샌드박스의 타임아웃을 관리해요. 그런 샌드박스는 직접 갱신하지 마세요.

중지 후 요청으로 트리거되는 재시작은 Resume on demand 문서를 참고하세요.

핵심 코드:

return sandbox.renewTimeout({ timeoutMs: remainingSeconds * 1_000 });

완전한 TypeScript 예시: timeout/renew.ts

import type { Sandboxes } from '@docker/sandboxes';

export async function renewSandboxTimeout(
  client: Sandboxes,
  name: string,
  remainingSeconds: number,
) {
  const sandbox = await client.get(name);
  return sandbox.renewTimeout({ timeoutMs: remainingSeconds * 1_000 });
}

더 알아보기 (Learn more)