목적: 공식 frappe_docker는 ERPNext만 포함하므로, HRMS 등 추가 앱을 포함한 커스텀 이미지를 로컬에서bench get-app(또는 apps.json) 방식으로 재빌드할 수 있도록, 그 구현 코드를 만들기 위한 기획·범위·경로·단계를 정의한다. 코드 생성 없음 — 기획·요구사항·산출물만 정리.
배경: 공식 이미지 = Frappe Framework + ERPNext. HRMS·Payments 등은 앱 추가 후 이미지 재빌드로만 포함 가능.
실행 환경: 로컬 머신(Mac/Linux)에서 Docker 빌드·태그·(선택) 레지스트리 푸시까지.
1. 공식 frappe_docker 구조 요약
구분
설명
공식 이미지
frappe/erpnext, frappe/bench 등 — Frappe + ERPNext 조합. HRMS 미포함.
앱 추가 방식
프로덕션에서는 컨테이너 런타임에 bench get-app 불가. 빌드 시점에 앱을 포함해 이미지로 만들어야 함.
빌드 경로
frappe_docker 리포의 images/custom/ 또는 images/layered/ + APPS_JSON_BASE64 (Base64 인코딩된 apps.json).
의존성
HRMS는 ERPNext에 의존. apps.json에 ERPNext → HRMS 순으로 명시 필요.
2. Base 경로·산출물 위치 제안
구분
경로
용도
frappe_docker 클론
로컬 작업 디렉터리 (예: ~/frappe_docker 또는 Prego 하위 tools/frappe_docker)
공식 리포 클론 — custom/layered Containerfile 재사용.
앱 정의·빌드 스크립트
동일 리포 내 apps.json, build.sh(또는 Makefile/docker build 래퍼)
HRMS 포함 앱 목록·로컬 빌드 실행.
생성 이미지 태그
로컬: prego-frappe-erpnext-hrms:VERSION (또는 프로젝트 네이밍 규칙에 맞게)
Ansible 등에서 frappe_bench_image 변수로 참조.
선택: Prego 레포에 tools/frappe-docker-build/ 같은 디렉터리를 두고, apps.json + 빌드 스크립트만 두고 frappe_docker는 git submodule 또는 문서상 “클론 경로”로 안내할 수 있음.
3. 기술 요구사항
3.1 apps.json 형식 (frappe_docker 공식)
JSON 배열. 각 요소: url(Git HTTPS), branch.
순서: Frappe는 이미 bench init에 포함되므로, 추가 앱만 나열. ERPNext → HRMS 순 (의존성 순).
docker build 호출 (custom vs layered 선택, build-arg 전달).
이미지 태그 네이밍 (naming-conventions.md와 통일: 예 prego-frappe-erpnext-hrms:15).
(선택) CI에서 빌드·푸시 시 Docker 레지스트리 인증·태그 전략.
docs/runbook 또는 README에 “로컬에서 HRMS 포함 이미지 빌드” 절 추가.
10. 멀티플랫폼 빌드 및 Docker Hub 업로드 가이드
로컬 환경에서 Intel/AMD(amd64)와 ARM(arm64) 두 아키텍처만 지원하는 Frappe/ERPNext v15 Docker 이미지를 만들고, Docker Hub에 하나의 매니페스트로 푸시하는 절차·설계 원칙을 정리한다. linux/386(32비트) 등 레거시는 지원하지 않으며, AWS·Oracle Ampere·GCP 등 실제 클라우드 환경에서 즉시 가동 가능한 Production-Ready 표준을 따른다. 코드는 생성하지 않고 가이드만 기술.
10.1 목적 및 범위
항목
내용
목적
단일 아키텍처가 아닌 멀티플랫폼(amd64 + arm64) 이미지를 빌드해, x86_64 서버(Intel Xeon 등)·ARM 서버(Ampere Altra, Mac M1/M2 등)에서 동일 태그로 풀 받아 사용할 수 있게 한다.
지원 플랫폼
linux/amd64, linux/arm64만. 32비트(linux/386)는 미지원.
범위
Dockerfile 구조 전략(Multi-stage·멀티 아키텍처 최적화), docker buildx를 이용한 로컬 빌드·푸시, Docker Hub 인증·매니페스트 검증.
비범위
Dockerfile·스크립트 본문(구현 시 별도 작성).
10.2 Dockerfile 설계 원칙 (Multi-Arch 최적화, 권한 문제 해결 최종 버전)
다양한 CPU 아키텍처에서 빌드 시 발생할 수 있는 바이너리 호환성 문제와 Frappe bench 권한 정책을 반영한 구조를 따른다.
원칙
내용
2단계 빌드 (Builder / Final)
Stage 1 (Builder): 베이스 --platform=$BUILDPLATFORM. root로 mkdir -p sites, common_site_config.json(socketio_port 등) 생성 후 **chown -R frappe:frappe /home/frappe/frappe-bench**로 소유권 부여. 그 다음 반드시 USER frappe로 전환한 뒤bench get-app hrms ..., bench build --app hrms 실행. Builder 결과물(apps/hrms, sites/assets)만 Final로 복사. Stage 2 (Final): root로 COPY·mkdir -p sites·chown -R frappe:frappe sites 후 USER frappe, HEALTHCHECK, EXPOSE 8000.
권한(USER) 전환 — 필수
bench 명령은 root에서 실행하면 안 된다. Frappe는 “You should not run this command as root” 경고 후 exit code 1로 종료한다. Builder에서 설정 파일·디렉터리 생성은 root로 수행해도 되지만, **bench 실행 전에 반드시 USER frappe**를 선언해야 빌드가 성공한다.
경량화·보안(Hardening)
최종 이미지에 빌드 도구를 넣지 않아 이미지 크기·요새화를 유지한다.
권한·헬스체크
Final 스테이지에서 USER frappe(최소 권한), HEALTHCHECK(예: curl -f http://localhost:8000/api/method/ping || exit 1)로 가용성 확인.
SRE 인사이트 (권한 실패 원인)
Frappe는 **방어적 설계(Defensive Design)**로 root에서의 bench 실행을 금지한다. root로 앱을 설치해 두면, 런타임에 frappe 일반 사용자가 로그·캐시를 쓸 때 Permission Denied가 나와 서비스가 멈출 수 있다. 이를 막기 위해 빌드 단계에서부터 frappe 사용자로 bench를 실행하도록 해야 한다.
구현 시 Dockerfile: Builder에서 root 작업 후 chown -R frappe:frappe ... → USER frappe → 그 다음에만 RUN bench get-app ... && bench build --app hrms. Final에서는 COPY 후 권한 정리·USER frappe·HEALTHCHECK·EXPOSE.
10.3 지원 플랫폼 및 이식성
플랫폼
용도
linux/amd64
Intel/AMD x86_64 서버(Hetzner, AWS, GCP 등).
linux/arm64
ARM 기반 서버(Oracle Ampere, AWS Graviton, Mac M1/M2 등).
미지원: **linux/386(32비트 x86)**은 레거시로 간주하여 지원하지 않는다. 실제 클라우드·프로덕션 환경에서 널리 쓰이는 amd64·arm64만 대상으로 한다.
이식성(Portability): 사용자는 docker pull USER/repo:TAG 시 아키텍처를 지정하지 않아도 Docker가 매니페스트를 보고 현재 CPU에 맞는 이미지를 받는다. Intel Xeon(x86) 서버에서도, Ampere Altra(ARM) 서버에서도 별도 수정 없이 동일 태그로 최적화되어 실행된다(인프라 유연성).
10.4 로컬 빌드 절차 (buildx)
멀티 아키텍처 이미지는 로컬 Docker 엔진에 한 번에 저장할 수 없으므로, 빌드와 동시에 Docker Hub로 푸시하는 것이 표준 방식이다. 순서대로 진행한다.
순서
단계
요약
1
빌더 엔진 초기화 (최초 1회)
docker buildx create --name prego-builder --use, 이어서 docker buildx inspect --bootstrap. 멀티 플랫폼 지원용 전용 빌더 생성·활성화. 이미 있으면 생략 가능.