-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile.pg
More file actions
59 lines (53 loc) · 2.81 KB
/
Dockerfile.pg
File metadata and controls
59 lines (53 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# PG runtime image — instance manager (PID 1) + vanilla PostgreSQL.
#
# 본 이미지는 PostgresCluster CR 의 shard StatefulSet 이 실행하는 컨테이너 이미지다.
# ADR 0002 에 따라 instance manager (Go binary) 가 PID 1 으로 동작하면서 postgres
# 자식 프로세스를 fork + supervise 한다.
#
# 빌드:
# docker build -f Dockerfile.pg --build-arg PG_MAJOR=18 -t ghcr.io/keiailab/pg:18 .
#
# 환경 변수 (controller 가 Pod env 로 주입 — F02-residual):
# POSTGRES_BIN_DIR — postgres 바이너리 디렉터리 (image 안 고정 경로)
# POSTGRES_DATA_DIR — PGDATA (PVC 마운트 안 subdir)
# POSTGRES_CONFIG_FILE — postgresql.conf 경로 (ConfigMap mount)
# POSTGRES_HBA_FILE — pg_hba.conf 경로 (ConfigMap mount)
# POSTGRES_LOCAL_DSN — Unix socket DSN (peer auth)
# POD_NAME, POD_NAMESPACE, POSTGRES_CLUSTER, POSTGRES_ROLE, POSTGRES_SHARD_ORDINAL
# — downward API + spec.
# 글로벌 ARG — 첫 FROM 보다 먼저 선언되어야 stage 의 FROM 에서 substitution 가능.
ARG PG_MAJOR=18
# ---- Stage 1: instance binary 빌드 ----
FROM golang:1.26-bookworm AS instance-builder
ARG TARGETOS
ARG TARGETARCH
WORKDIR /workspace
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} \
go build -a -trimpath -ldflags="-s -w" -o /out/instance ./cmd/instance
# ---- Stage 2: PG runtime ----
# postgres:${PG_MAJOR}-bookworm 공식 이미지를 base — pg_ctl, postgres, initdb, psql 포함.
# 별도 빌드 (apt-get build-dep postgresql) 는 attack surface 증가 + 빌드 시간 비용으로
# alpha 단계에서는 공식 이미지 사용 (ADR 후속에서 자체 빌드 결정).
# 글로벌 ARG 가 stage 안에서도 가시화되도록 한 번 더 선언 (Docker 규약).
ARG PG_MAJOR
FROM postgres:${PG_MAJOR}-bookworm AS runtime
# instance binary 를 표준 경로로 복사. 컨테이너 ENTRYPOINT.
COPY --from=instance-builder /out/instance /usr/local/bin/instance
# 비 root 운영 — postgres user (ADR 0006 dataplanePodSecurityContext UID 70).
# postgres 공식 이미지의 postgres user 가 UID/GID 999 인데, ADR 0006 은 70 으로 동결.
# K8s SecurityContext 가 runAsUser=70 강제하므로 image 안에 user 70 추가.
# pgBackRest 는 BackupJob executionMode=job runner 와 후속 sidecar exec 가 같은
# PG runtime image 를 재사용할 수 있도록 포함한다.
USER root
RUN apt-get update \
&& apt-get install -y --no-install-recommends pgbackrest \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd -g 70 pg-keiailab \
&& useradd -u 70 -g 70 -m -d /var/lib/postgresql-keiailab -s /bin/bash pg-keiailab \
&& chmod 755 /usr/local/bin/instance
USER 70:70
# ENTRYPOINT 는 instance manager. instance 가 postgres child 를 fork.
ENTRYPOINT ["/usr/local/bin/instance"]