[SpringBoot/MongoDB] mongoDB docker compose 실행이 안 되는 문제 - error opening file: /etc/mongodb.key: bad file

binda·2024년 9월 9일

프로젝트 정리

목록 보기
6/9

원격서버에서 mongoDB 컨테이너를 실행시키기 위해서

docker compose up --build -d 실행할 컨테이너

명령어로 빌드 후 백그라운드에서 실행을 시켰는데, 이상하게 실행을 시키고
docker ps -a 로 목록을 확인해보면 자꾸 exited 가 되는 상황이 발생했다.

CONTAINER ID   IMAGE                                                COMMAND                  CREATED          STATUS                       PORTS      NAMES
0ddfa717bdad   mongodb/mongodb-community-server:5.0.17-ubuntu2004   "python3 /usr/local/…"   59 seconds ago   Exited (51) 54 seconds ago              mongo_new

그래서

docker logs 컨테이너이름

으로 로그를 확인해보니 mongodb.key 권한때문에 접근을 할 수 없다고 하길래,
로컬에서 mongodb.key를 생성하고, chmod 600 으로 권한을 생성한 뒤에 해당 원격서버로 scp 명령어를 통해 복사까지 하고, docker compose yml 파일도 수정했다.

scp -i {ssh key 경로} /{mongodb생성된 로컬의 경로}/mongodb.key ubuntu@{원격서버 퍼블릭 IP}:/home/ubuntu/mongodb.key

docker-compose.yml

services:
  mongodb:
    image: mongodb/mongodb-community-server:5.0.17-ubuntu2004
    container_name: mongo_new
    environment:
      MONGODB_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME} # 기본 관리자 계정의 사용자 이름
      MONGODB_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}  # 기본 관리자 계정의 비밀번호
    ports:
      - "${MONGO_PORT}:${MONGO_PORT}"
    volumes:
      - db-data:/mongo
      - ${MONGO_KEY_FILE}:/etc/mongodb.key
    command: mongod --replSet rs0 --keyFile /etc/mongodb.key --bind_ip_all

{MONGO_KEY_FILE} 파일에는 해당 파일이 복사된 원격서버의 path 경로를 env에다가 설정해줬다.(로컬과 구분짓기 위함)

/home/ubuntu/mongodb.key

로 설정이 되어있다. (원격서버의 프로젝트 디렉토리 경로로 복사하면 된다.)

그리고 다시,
명령어로 해당 컨테이너를 삭제후 재빌드를 하려고 보니!

이런에러가.. 컨테이너를 생성할 디스크 공간이 없다고 한다..

df -h

명령어를 통해 디스크 공간을 확인해보니

....... 왤케 마니 썼지?

🤖 AI 의 답변

그래서

sudo docker system prune -a

명령어를 통해 불필요한 docker 컨테이너, 이미지 등을 정리를 해서
Total reclaimed space: 90.03MB
이정도의 공간을 확보했으나 턱없이 부족하다.

그래서 docker volume 도 정리해줬다.
결과적으로, Total reclaimed space: 2.335GB 공간을 확보했다.

그리고 캐시 파일들도 정리해주어서 2.4G를 확보할 수 있었다.

그럼에도 여전히 Exited (1) 되는 상황이 발생
다시 로그를 확인해보니

error opening file: /etc/mongodb.key: bad file

여전히 문제가 발생.
/etc/mongodb.key 파일을 읽지 못해 인증 설정이 실패했다는데

key 파일 경로가 분명
-rw------- 1 ubuntu ubuntu 1024 Sep 9 09:04 /home/ubuntu/mongodb.key
로 잘 확인이되고, 권한도 줬는데 대체 뭐가 문제인 걸까..

..알고보니복사한 경로가 잘못되어있었다..
프로젝트 내부가 아닌 다른 경로에 만들어졌기 때문에 당연히 못찾을 수 밖에.. 완전 바보

CONTAINER ID   IMAGE                                                COMMAND                  CREATED         STATUS         PORTS                                            NAMES
067bf0d3a200   mongodb/mongodb-community-server:5.0.17-ubuntu2004   "python3 /usr/local/…"   2 minutes ago   Up 2 minutes   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp    mongo_new

경로를 고치고 docker ps -a 를 해보니 이제 잘 실행된다!


[정리👉]
추가로 로컬에 mongodb.key를 생성하고 ec2원격서버에 복사하는 방법

openssl rand -base64 756 > mongodb.key

로컬에 저장된 mongodb.key 의 경로를 복사 후

scp -i {ec2서버의 pem키 경로 (ssh인증을 위함)} /로컬의/경로/mongodb.key ubuntu@ec2서버의퍼블릭IP주소:/복사할/원격서버의/path/mongodb.key

를 통해 복사를 한뒤
원격서버에서

chmod 600 /복사한/원격서버/경로/mongodb.key

권한을 주고 docker-compose.yml 파일을 수정하면 된다.

version: '3'
services:
  mongodb:
    image: mongodb/mongodb-community-server:5.0.17-ubuntu2004
    container_name: mongo_new
    environment:
      MONGODB_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME} # 기본 관리자 계정의 사용자 이름
      MONGODB_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}  # 기본 관리자 계정의 비밀번호
    ports:
      - "${MONGO_PORT}:${MONGO_PORT}"
    volumes:
      - db-data:/mongo
      - ${MONGO_KEY_FILE}:/etc/mongodb.key
    command: 'mongod --replSet myReplicaSet --keyFile /etc/mongodb.key --bind_ip_all'

나같은 경우에는 위에도 설명했듯 로컬환경과 분리하기 위해서 MONGO_KEY_FILE 환경변수를 설정하여 로컬 env에는 로컬에 생성한 mongodb.key를, 원격서버에 env파일에는 복사한 원격서버의 경로를 저장해놓았다.


저번부터 자꾸 경로문제가 발생하는데,
정신 🍒자!


참고
mongod-keyFile-시-permissions-on-etcmongodbkey-are-too-open-또는-etcmongodbkey-bad-file

profile
🍤

0개의 댓글