2026. 1. 20. 12:31ㆍ문제해결
배경
프로메테우스 컨테이너를 클라우드에 배포하려고 했으나 다음과 같은 에러가 발생하여 계속 재시작하는 문제가 있었습니다.

위 에러 결과를 보면 컨테이너의 `/prometheus/data/queries.active` 파일을 `./data` 디렉토리 아래에 작성하려고 했으나 `./data` 디렉토리가 존재하지 않아서 에러가 발생했다는 결과입니다.
현재 docker-compose의 프로메테우스 서비스의 설정은 다음과 같습니다.
다음 설정 중에서 주목할 부분은 볼륨의 바인드 마운트 방식으로 설정된 부분입니다. 호스트 디렉토리의 `./prometheus/volume` 경로와 컨테이너의 `/promethues` 경로를 연결하도록 설정하였습니다.
prometheus:
container_name: fineAnts_prometheus
image: prom/prometheus:v2.48.0
restart: always
ports:
- "9090:9090"
command:
- '--web.enable-lifecycle'
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
volumes:
- ./prometheus/volume:/prometheus
networks:
- spring-net
원인
위와 같은 에러가 발생한 원인은 호스트 디렉토리의 `./prometheus/volume` 디렉토리 아래에 `data` 디렉토리가 존재하지 않기 때문입니다.
해결방법
호스트 디렉토리의 `./prometheus/volume` 디렉토리 경로 아래에 `data` 디렉토리를 생성합니다.
mkdir -p $WORK_DIR/prometheus/volume/data
실행 결과를 보면 `data` 디렉토리가 volume 디렉토리 아래에 정상적으로 생성된 것을 볼수 있습니다.

하지만 여기서 해결되는 것이 아닌 추가적인 권한 및 소유자를 다시 설정해주어야 합니다.
현재 `data` 디렉토리의 소유자는 `fineants` 사용자로 설정되어 있습니다. 이렇게 설정되어 있으면 컨테이너의 내부 사용자(nobody, 65534)와 호스트 파일 시스템(fineants 사용자)간의 권한 불일치로 인하여 에러가 발생합니다. 프로메테우스 공식 이미지 내부에서는 nobody(65534)라는 사용자가 미리 생성되어 있습니다.

따라서 위와 같은 권한 문제를 해결하기 위해서 `data` 디렉토리의 소유자 권한을 `fineants`가 아닌 `nobody(65534)`로 설정해야 합니다.
sudo chown -R 65534:65534 $WORK_DIR/prometheus/volume/data
실행 결과를 보면 `data` 디렉토리의 소유자가 `nobody`로 변경된 것을 볼수 있습니다.

위 실행 결과를 통해서 `data` 디렉토리의 권한을 보면 `775(rwxrwxr-x)`로 설정되어 있습니다. 해당 디렉토리 및 디렉토리 아래의 파일 권한을 `755(rwxr-xr-x)`로 변경합니다.
sudo chmod -R 755 $WORK_DIR/prometheus/volume/data
실행 결과를 보면 정상적으로 권한이 변경된 것을 볼수 있습니다.

docker 컨테이너 실행시 user 옵션 명세적으로 설정하기
프로메테우스 컨테이너 실행시 `user` 옵션을 명세적으로 "65534:65534"로 설정합니다.
prometheus:
container_name: fineAnts_prometheus
image: prom/prometheus:v2.48.0
restart: always
user: "65534:65534"
ports:
- "9090:9090"
command:
- '--web.enable-lifecycle'
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
volumes:
- ./prometheus/volume:/prometheus
networks:
- spring-net
배포 과정중에 프로메테우스 data 디렉토리 생성 및 권한 설정하기
현재 프로젝트의 서버 배포는 Github Actions를 이용하여 수행됩니다. 배포 과정 중에서 프로메테우스 서비스의 설정 파일은 시크릿 정보이기 때문에 설정파일을 복사하기 전에 디렉토리 준비 단계에서 `data` 디렉토리 또한 미리 생성하고 권한을 설정하여 별도로 디렉토리 생성 및 권한을 수동적으로 하지 않도록 해줍니다.
다음 스텝을 보면 Compute Engine에 SSH 접속하여 `config` 및 `volume/data` 디렉토리를 직접 생성하고 파일 및 디렉토리 권한, 소유자를 설정합니다.
- name: Prepare Prometheus Directory
uses: appleboy/ssh-action@v0.1.7
with:
host: ${{ env.GCP_INSTANCE_IP }}
username: ${{ env.GCP_SSH_USERNAME }}
passphrase: ${{ env.GCP_SSH_PASSPHRASE }}
key: ${{ env.GCP_SSH_PRIVATE_KEY }}
script: |
mkdir -p ${{ env.WORK_DIR }}/prometheus/config
mkdir -p ${{ env.WORK_DIR }}/prometheus/volume/data
sudo chown -R ${{ env.GCP_SSH_USERNAME }}:${{ env.GCP_SSH_USERNAME }} ${{ env.WORK_DIR }}/prometheus
sudo chmod -R 755 ${{ env.WORK_DIR }}/prometheus
sudo chown -R 65534:65534 ${{ env.WORK_DIR }}/prometheus/volume/data
실행 결과
docker 또는 docker-compose 명령어를 이용하여 컨테이너를 실행시킨 다음에 다음 명령어를 실행하여 프로메테우스 컨테이너가 정상적으로 실행되고 있는지 확인합니다.
curl -I http://localhost:9090/-/healthy
실행 결과를 보면 정상적으로 200 OK가 응답되었습니다.

References
'문제해결' 카테고리의 다른 글
| Spring AOP 로깅 메모리 누수 문제 해결 (0) | 2026.01.20 |
|---|---|
| VisualVM Profiler 사용할 때 특정 Profile Class가 표시되지 않는 문제 해결 (0) | 2025.12.15 |
| Github Action, act 로컬 테스트 실행시 SSH Private Key 저장 문제 해결 (0) | 2025.12.05 |
| Gradle 빌드 수행시 JDK 버전과 Lombok 라이브러리 버전 충돌로 인한 빌드 실패 문제 해결 (0) | 2025.11.29 |
| Spring JPA 대용량 데이터 조회 최적화, 300만건 포트폴리오 손익 데이터 처리 개선 사례 (0) | 2025.04.29 |