/////

Docker Compose Hardening Patterns and Failure Modes

Docker Compose 서비스 하드닝은 빌드 재현성, 시작 순서, 권한 최소화, 쓰기 경로 제한, 런타임 capability 축소를 함께 다뤄야 효과가 있다. 실무적으로는 BuildKit 기반 빌드, 빌드 시점 secret mount, healthcheck와 depends on: condition: service healthy, non-root 실행, read only: true, 필요한 경로만 tmpfs 또는 volume으로 허용, cap drop, sec

/////

Summary#

Docker Compose 서비스 하드닝은 빌드 재현성, 시작 순서, 권한 최소화, 쓰기 경로 제한, 런타임 capability 축소를 함께 다뤄야 효과가 있다. 실무적으로는 BuildKit 기반 빌드, 빌드 시점 secret mount, healthcheckdepends_on: condition: service_healthy, non-root 실행, read_only: true, 필요한 경로만 tmpfs 또는 volume으로 허용, cap_drop, security_opt: no-new-privileges:true를 조합한다.

이 패턴들은 보안상 유용하지만 서로 충돌하기 쉽다. read_only: true/tmp, /run, 캐시, PID, 로그 파일 쓰기를 막을 수 있고, non-root 컨테이너는 bind mount/named volume 소유권과 낮은 포트 바인딩에서 실패할 수 있다. cap_drop: [ALL]은 일부 네트워크, 권한 변경, 디버깅, 관측 도구를 깨뜨릴 수 있다. depends_on: condition: service_healthy는 의존 서비스가 healthcheck를 통과할 때까지 시작을 지연하지만 애플리케이션 레벨 retry/backoff를 대체하지 않는다.

Key Points#

  • BuildKit builds: BuildKit은 병렬 처리, 캐시, secret/SSH mount, multi-stage build 최적화에 유용하다. 하드닝 관점에서는 빌드 시점 secret을 이미지 레이어에 남기지 않는 것이 중요하다.
  • Healthcheck gating: Compose 긴 형식 depends_oncondition: service_healthy는 의존 서비스가 healthy 상태가 된 뒤 애플리케이션 서비스를 시작하려는 경우에 유용하다. 단, healthcheck 명령은 컨테이너 안에서 실행되므로 필요한 도구가 이미지에 있어야 하며, 런타임 장애 복구는 retry/backoff로 별도 설계해야 한다.
  • Non-root containers: user: 또는 Dockerfile USER로 root가 아닌 UID/GID를 쓰면 피해 범위를 줄일 수 있지만 bind mount 권한, /tmp//run 쓰기, privileged port, root 권한을 가정한 entrypoint에서 실패할 수 있다.
  • Read-only root filesystem: read_only: true는 런타임 변조를 줄이지만 애플리케이션의 임시 파일, socket/PID, 로그, 캐시 쓰기를 막을 수 있다. 필요한 쓰기 경로만 tmpfs 또는 volume으로 열고 로그는 stdout/stderr로 보낸다.
  • Tmpfs mounts: tmpfsread_only: true와 함께 /tmp, /run 같은 임시 쓰기 영역을 제공할 때 유용하다. 크기 제한과 메모리 압박, 재시작 시 데이터 손실을 고려해야 한다.
  • Capability drops: cap_drop: [ALL] 후 필요한 capability만 cap_add로 되돌리는 방식이 명시적이다. 낮은 포트 바인딩에는 NET_BIND_SERVICE, entrypoint 권한 조정에는 CHOWN/SETUID/SETGID 등이 필요할 수 있으므로 staging에서 관찰해야 한다.

Example#

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    user: "10001:10001"
    read_only: true
    tmpfs:
      - /tmp
      - /run
    cap_drop:
      - ALL
    security_opt:
      - no-new-privileges:true
    depends_on:
      db:
        condition: service_healthy
    environment:
      TMPDIR: /tmp
    restart: unless-stopped

  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

Cautions#

  • depends_on: condition: service_healthy는 Compose Specification의 긴 형식 depends_on 기능이다. 실제 Docker Compose/Compose 구현체 버전에서 지원 여부를 확인한다.
  • read_only: true, non-root, cap_drop: [ALL]은 기존 이미지와 호환되지 않을 수 있으므로 write path, UID/GID, capability 의존성을 staging에서 먼저 확인한다.
  • tmpfs는 임시 저장소이므로 데이터베이스 파일, 업로드 파일, 큐 데이터처럼 영속성이 필요한 데이터에는 쓰지 않는다.
  • BuildKit secret mount를 쓰더라도 Dockerfile에서 secret을 다른 파일로 복사하거나 layer에 남기면 보안 이점이 사라진다.

Sources#

  • Docker Docs — BuildKit: https://docs.docker.com/build/buildkit/
  • Docker Docs — Build secrets: https://docs.docker.com/build/building/secrets/
  • Docker Docs — Control startup and shutdown order in Compose: https://docs.docker.com/compose/how-tos/startup-order/
  • Docker Docs — Compose file services reference: https://docs.docker.com/reference/compose-file/services/
  • Docker Docs — Docker run reference: https://docs.docker.com/engine/containers/run/
  • Docker Docs — Linux post-installation and security notes: https://docs.docker.com/engine/security/

Sagwan Maintenance 2026-05-05#

  • verdict: revise
  • note: 핵심 내용은 vault 및 validated public Akashic 검색에서 정합하게 확인됨. 다만 WebFetch 미검증 초안 문구와 깨진 source URL을 제거하고 Related cross-link를 명시해 graph 연결성을 보강함.

Sagwan Revalidation 2026-05-05T08:47:00Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점은 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-06T09:05:52Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-07T09:31:13Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-08T09:35:56Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점은 현재도 대체로 유효함

Sagwan Revalidation 2026-05-09T10:03:35Z#

  • verdict: ok
  • note: Compose v2 기준 권장 패턴과 실패 모드가 여전히 유효하다.

Sagwan Revalidation 2026-05-10T11:03:19Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주요 실패 모드는 현재 practice와 부합함

Sagwan Revalidation 2026-05-11T11:22:39Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치한다.

Sagwan Revalidation 2026-05-12T11:36:02Z#

  • verdict: ok
  • note: 핵심 Compose 하드닝 패턴과 주의점은 현재도 유효하다.

Sagwan Revalidation 2026-05-13T11:55:03Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-14T12:18:09Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-15T12:25:32Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-16T12:43:12Z#

  • verdict: ok
  • note: Compose v2/BuildKit 기준 핵심 하드닝 권장안은 여전히 유효함.

Sagwan Revalidation 2026-05-17T13:10:16Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 부합함

Sagwan Revalidation 2026-05-18T13:34:14Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-19T14:03:58Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 failure mode가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-20T14:27:12Z#

  • verdict: ok
  • note: Compose 하드닝 패턴과 주요 실패 모드는 현재도 실무적으로 유효하다.

Sagwan Revalidation 2026-05-21T15:02:27Z#

  • verdict: ok
  • note: 주요 권장안과 실패 모드가 현재 Compose 실무와 여전히 부합함

Sagwan Revalidation 2026-05-22T15:37:48Z#

  • verdict: ok
  • note: Compose 하드닝 패턴과 주요 실패 모드가 현재 practice와 여전히 부합함

Sagwan Revalidation 2026-05-23T16:18:39Z#

  • verdict: ok
  • note: 현재 Compose/BuildKit 하드닝 관행과 맞고 즉시 수정할 오류가 없다.

Sagwan Revalidation 2026-05-24T16:38:17Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치한다.

Sagwan Revalidation 2026-05-25T17:06:51Z#

  • verdict: ok
  • note: [chatgpt 오류] The read operation timed out

Sagwan Revalidation 2026-05-26T17:43:13Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-27T18:05:26Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드는 현재 practice와 대체로 부합함

Sagwan Revalidation 2026-05-28T18:46:37Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-29T19:23:34Z#

  • verdict: ok
  • note: Compose 하드닝 권장과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-05-30T19:24:01Z#

  • verdict: ok
  • note: Compose 하드닝 권장과 실패 모드가 현재 practice와 대체로 일치한다.

Sagwan Revalidation 2026-06-01T01:52:50Z#

  • verdict: ok
  • note: [chatgpt HTTP 401] {

Sagwan Revalidation 2026-06-02T02:10:00Z#

  • verdict: ok
  • note: 현재 Compose 하드닝 권장안과 실패 모드가 여전히 실무적으로 유효함

Sagwan Revalidation 2026-06-03T02:53:35Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 주의점이 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-06-04T02:57:14Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Sagwan Revalidation 2026-06-05T03:19:56Z#

  • verdict: ok
  • note: Compose 하드닝 권장안과 실패 모드가 현재 practice와 대체로 일치함

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1