완전한 예시 실행하기

완전한 예시 실행하기

Docker에 로그인하고, shell 키트에서 샌드박스를 만들고, 인사말을 출력하고, 샌드박스를 삭제하는 작은 프로그램을 실행해 봐요. 이 예시에는 모델 제공자 키가 필요 없어요.

출처: 문서

본문

먼저 SDK를 설치하세요. Docker 계정에 Cloud Sandboxes 접근과 청구가 설정되어 있어야 해요. 이 프로그램은 2 CPU와 4096 MiB 메모리의 실제 샌드박스를 만들어요. 컴퓨트 사용량은 Docker 청구 약관의 적용을 받아요.

프로그램 실행

완전한 예시를 펼쳐 전체 프로그램을 파일로 복사하세요. example.mts로 저장한 뒤 npx tsx example.mts를 실행하세요.

프로그램이 검증 URL과 코드를 출력해요. URL을 열고 코드를 입력해 로그인을 승인하세요. 그러면 터미널에 샌드박스의 이름과 Hello from Docker Sandboxes가 보여요. 프로그램은 명령의 종료 상태를 확인하고 클라이언트를 닫기 전에 샌드박스 삭제를 시도해요.

프로그램은 로그인이 끝나거나 검증 코드가 만료될 때까지 기다려요. 로그인 후 샌드박스 생성과 명령 실행은 5분의 공유 시간 제한을 가져요. 프로그램이 새 샌드박스의 세부 정보를 받으면 나중 단계가 실패해도 샌드박스 삭제를 위해 30초를 더 허용해요.

로그인이 실패하면 Authenticate to Docker 문서의 단계를 따르세요. 샌드박스 생성이 실패하면 계정 접근과 리소스 제한을 확인하세요.

생성 타임아웃은 Docker가 샌드박스를 만든 후 프로그램이 그 세부 정보를 받기 전에 발생할 수 있어요. 그 경우 프로그램은 샌드박스를 삭제할 수 없어요. 이 실행으로 만들어진 샌드박스가 있는지 샌드박스를 나열해 확인하고 필요하면 삭제하세요. 삭제가 실패하거나 타임아웃되면 터미널에 출력된 샌드박스 이름으로 여전히 존재하는지 확인하세요.

이 예시는 일회성 데모이므로 샌드박스를 삭제해요. 다음으로는 나중에 작업하기 위해 샌드박스를 유지하거나 에이전트 키트를 실행하세요.

핵심 코드:

const result = await sandbox.processes.run(
  {
    args: ['echo', 'Hello from Docker Sandboxes'],
  },
  operation,
);
console.log(result.stdout);

완전한 TypeScript 예시: hello/main.ts

import { pathToFileURL } from 'node:url';
import { oauth, Sandboxes, type Sandbox } from '@docker/sandboxes';

export async function main() {
  const auth = oauth({
    onVerification: ({ verificationUri, userCode }) => {
      console.log(`Open ${verificationUri} and enter ${userCode}`);
    },
  });
  const client = new Sandboxes({ auth });
  let sandbox: Sandbox | undefined;
  try {
    await auth.getAccessToken();
    const operation = {
      signal: AbortSignal.timeout(300_000),
      timeoutMs: 300_000,
    };

    sandbox = await client.kits.launch(
      'shell',
      {
        resources: { cpus: 2, memoryMib: 4096 },
      },
      operation,
    );
    console.log(`Sandbox: ${sandbox.name}`);

    sandbox = await sandbox.waitUntilRunning(operation);
    const result = await sandbox.processes.run(
      {
        args: ['echo', 'Hello from Docker Sandboxes'],
      },
      operation,
    );
    console.log(result.stdout);
    if (result.exitCode !== 0)
      throw new Error(`Command exited with status ${result.exitCode}`);
  } finally {
    try {
      if (sandbox) {
        const cleanup = { signal: AbortSignal.timeout(30_000) };
        const deleting = await sandbox.delete({ force: true }, cleanup);
        await deleting?.waitUntilDeleted(cleanup);
      }
    } finally {
      await client.close();
    }
  }
}

if (
  process.argv[1] &&
  import.meta.url === pathToFileURL(process.argv[1]).href
) {
  main().catch((error: unknown) => {
    console.error(error);
    process.exitCode = 1;
  });
}

더 알아보기 (Learn more)