첫 번째 명령 실행하기
첫 번째 명령 실행하기
기존 샌드박스에서 명령을 실행하고 그 출력을 수집해요. 인증된 클라이언트와 첫 번째 실행에서 반환된 샌드박스 이름으로 시작해요. 대부분의 명령에는 프로세스 컬렉션의 run 헬퍼를 사용해요. 프로세스를 시작하고 결과를 기다려줘요.
출처: 문서
본문
샌드박스 열기
리소스 이름으로 샌드박스를 얻어요. 반환된 핸들은 processes와 files를 노출하고 그들의 인증된 연결을 관리해요. 샌드박스 주소나 Docker 토큰을 두 번째 클라이언트에 복사할 필요가 없어요.
return client.get(name);
완전한 TypeScript 예시: exec/endpoint.ts
import type { Sandboxes } from '@docker/sandboxes';
export async function processesAt(client: Sandboxes, name: string) {
return client.get(name);
}
프로세스 run 헬퍼 사용하기
['echo', 'Hello from Docker Sandboxes']처럼 프로그램 뒤에 인자를 붙인 배열을 전달해요. 인자는 셸 문법이 아니에요. 파이프, 리다이렉션, 변수 확장이 필요하면 스크립트를 다음 인자로 넣어 sh -c를 실행해요. run 헬퍼는 출력을 수집한 뒤 프로세스 결과를 반환해요. SDK 호출이 성공했다고 명령이 성공한 것은 아니에요. 종료 코드를 확인하세요. 표준 오류는 진단용 출력이며 종료 코드가 0이어도 비어 있지 않을 수 있어요. SDK 오류는 요청, 대기, 또는 연결이 실패했음을 뜻해요. 오류가 운반하는 프로세스 핸들을 사용할 수 있다면 보관해서 중복 작업을 시작하는 대신 검사해요. "Error handling"에서 그 구분을 설명해요.
return sandbox.processes.run({ args }, { timeoutMs: 300_000 });
완전한 TypeScript 예시: exec/outcome.ts
import type { Sandbox } from '@docker/sandboxes';
export async function classifyOutcome(sandbox: Sandbox, args: string[]) {
return sandbox.processes.run({ args }, { timeoutMs: 300_000 });
}
선택: 명령을 직접 실행하기
명령이 종료된 뒤에만 출력이 필요할 만큼 짧은 명령이라면 직접 실행이 더 단순해요. 요청 하나가 명령을 기다렸다가 캡처된 출력과 종료 코드를 반환하므로, 별도의 프로세스 생성·출력 읽기 절차가 없어요. 캡처된 출력을 완전한 것으로 취급하기 전에 incomplete 플래그를 확인해요. 명령이 실행되는 동안 출력이 필요하면 스트리밍 출력을 선택해요.
const result = await endpoint.api.exec({ body: { cmd: args } });
완전한 TypeScript 예시: exec/exec.ts
import type { Sandbox } from '@docker/sandboxes';
export async function runCommand(sandbox: Sandbox, args: string[]) {
const endpoint = await sandbox.endpointClient(['sandboxesExec'], 'exec');
try {
const result = await endpoint.api.exec({ body: { cmd: args } });
return {
exitCode: result.exitCode ?? 0,
stdout: new TextDecoder().decode(result.stdout),
stderr: new TextDecoder().decode(result.stderr),
incomplete: result.incomplete ?? false,
};
} finally {
await endpoint.close();
}
}