[s2n] 도커 기반 런타임 아키텍처 설계 + 배경지식 공부
November 16, 2025
이번에 내가 담당한 티켓은 “스캐너가 실행되는 타임 환경 전체 설계”하기이다. 즉 PyPI 패키지로 배포된 s2n이 어디서, 어떤 환경에서, 어떤 방식으로 동작할지를 결정하고 구현하는 것이다.
핵심 작업
1) prod/dev Docker 이미지 설계 및 빌드 (내가 핵심적으로 맡은 부분)
스캐너의 실제 실행 환경은 모두 도커 컨테이너 안에서 돌아간다. 그래서 나는 아래 내용들을 담당하게 된다.
- Prod 이미지: 최종 사용자 실행용 (안정성/보안/재현성 중심)
- Dev 이미지: 개발/디버깅용
- Dockerfile 설계
- 의존성 버전 고정
- 이미지 크기 최적화
- EntryPoint 설정
- 빌드/태깅/레지스트리 push 자동화 => 실행 엔진을 만드는 작업
2) PyPI 패키지와 Docker 이미지 연결 (Wrapper Layer 설계) -> CLI 부분 (내담당 아님)
사용자는
pip install s2n
s2n scan --url http://target
으로 실행하지만 실제로는
docker run s2n/runtime:prod ...
이 도커 컨테이너가 실행된다. 즉 로컬 파이썬 코드 -> 도커 런타임으로 연결되는 bridge layer을 설계하는 작업을 해야 한다.
- docker binary 탐지
- 이미지 존재 여부 확인 -> 없으면 자동 pull
- CLI 인자를 컨테이너 내부로 전달
- subprocess로 docker run 실행
- 결과를 파이썬에서 다시 받아 파싱 => PyPI 패키지의 핵심 기능
3) Dev/Prod 런타임 환경 완전 분리 -> 1,2 완성되면 자동으로 되어있을 예정
플러그인은 모두 컨테이너 안에서 돌아가지만, dev/prod는 완전 다른 이미지로 분리된다.
- dev -> 디버깅/로깅/테스트 도구 포함
- prod -> 최소 실행환경/보안 강화/크기 최소화
4) CI/CD + 이미지 빌드 자동화
이미지를 개발자가 직접 빌드하지 않도록 CI/CD에서 자동으로
- 테스트
- 이미지 빌드
- 이미지 태깅 (Dev/prod)
- 레지스트리 push
- PyPI 패키지 빌드
- 버전 동기화 까지.
필요한 배경지식
(1) Docker / Containerization 기본기
- Dockerfile 구조
- multi-stage build
- ENTRYPOINT / CMD
- image layer 구조
- alpine / slim 기반 이미지 선택 기준
- 볼륨 마운트 방식 (-v)
- 네트워크 옵션
- 이미지 태깅 규칙(최소 latest 금지)
- 컨테이너 보안 기초(CAP_DROP 등)
(2) Docker Registry 사용 스캐너가 사용할 이미지는 외부 레지스트리에서 pull 되므로
- Docker Hub
- GitHub Container Registry(GHCR)
- 이미지 push / pull
- 태그 관리(dev, prod, v1.0.0 등)
(3) Python ↔ Docker 연결(Python Wrapper 기술)
- Python subprocess
- docker run command 구성
- stdout/stderr 처리
- JSON 직렬화/역직렬화
- 예외 처리(이미지 없음, Docker daemon 꺼짐 등)
(4) PyPI Packaging
- pyproject.toml
- wheel / sdist
- entry_points (CLI 명령 등록)
- build backend (setuptools/hatch/pdm-backend)
- MANIFEST.in / 패키지 포함 파일 관리
- 버전 정책(semver)
도커와 PyPI가 분리되어 있으므로 Python 패키징도 제대로 이해해야 한다.
(5) CI/CD 파이프라인 설계 (GitHub Actions)
- 테스트 후 이미지 빌드
- 병렬 실행
- 캐싱
- Docker login + push
- PyPI publish 자동화
- 버전 bump 전략
- 실패 시 rollback 전략
(6) 개발/운영 환경 분리 철학 (Environment Isolation)
- dev 환경은 자유도·속도
- prod 환경은 안정성·재현성
- 각각의 lifecycle이 다르다는 점
- plugin sandbox 필요성(보안)