콘텐츠로 이동

실행기

명령 실행기는 제어된 환경에서 외부 프로세스를 실행합니다. 두 가지 실행기 타입을 사용할 수 있습니다: 네이티브 OS 프로세스와 Docker 컨테이너.

Kind설명
exec.native호스트 OS에서 직접 명령 실행
exec.dockerDocker 컨테이너 내에서 명령 실행

호스트 운영 체제에서 직접 명령을 실행합니다.

- name: shell
kind: exec.native
default_work_dir: /app
default_env:
PATH: /usr/local/bin:/usr/bin:/bin
LANG: en_US.UTF-8
command_whitelist:
- git status
- git diff
- npm run build
필드타입기본값설명
default_work_dirstring-모든 명령의 작업 디렉토리
default_envmap-환경 변수 (명령별 env와 병합)
command_whiteliststring[]-설정 시 이 정확한 명령만 허용
네이티브 실행기는 기본적으로 깨끗한 환경을 사용합니다. 명시적으로 설정된 환경 변수만 자식 프로세스에 전달됩니다.

격리된 Docker 컨테이너 내에서 명령을 실행합니다.

- name: sandbox
kind: exec.docker
image: python:3.11-slim
default_work_dir: /workspace
network_mode: none
memory_limit: 536870912
cpu_quota: 50000
auto_remove: true
read_only_rootfs: true
no_new_privileges: true
cap_drop:
- ALL
tmpfs:
/tmp: rw,noexec,nosuid,size=64m
volumes:
- /app/data:/workspace/data:ro
필드타입기본값설명
imagestring필수사용할 Docker 이미지
hoststringunix 소켓Docker 데몬 URL
default_work_dirstring-컨테이너 내 작업 디렉토리
default_envmap-환경 변수
command_whiteliststring[]-허용된 명령 (정확한 일치)
network_modestringbridge네트워크 모드: host, bridge, none
volumesstring[]-볼륨 마운트: host:container[:ro]
userstring-컨테이너 내에서 실행할 사용자
memory_limitint0메모리 제한 (바이트, 0 = 무제한)
cpu_quotaint0CPU 할당량 (100000 = 1 CPU, 0 = 무제한)
auto_removeboolfalse종료 후 컨테이너 제거
read_only_rootfsboolfalse루트 파일시스템 읽기 전용
no_new_privilegesboolfalse권한 상승 방지
cap_dropstring[]-제거할 Linux 기능
cap_addstring[]-추가할 Linux 기능
pids_limitint0최대 프로세스 (0 = 무제한)
tmpfsmap-쓰기 가능한 경로용 Tmpfs 마운트

두 실행기 타입 모두 명령 화이트리스팅을 지원합니다. 설정된 경우 정확한 명령 일치만 허용됩니다:

command_whitelist:
- ls -la
- cat /etc/passwd

화이트리스트에 없는 명령은 에러로 거부됩니다.

Exec 모듈은 명령 실행을 제공합니다:

local exec = require("exec")
local executor, err = exec.get("app:shell")
if err then return nil, err end
local proc = executor:exec("git status", {
work_dir = "/app/repo"
})
local stdout = proc:stdout_stream()
proc:start()
local output = stdout:read()
proc:wait()
stdout:close()
executor:release()