카테고리 없음

[docker] 컨테이너 내 db를 유지하면서 새 환경변수를 적용하는 법

hanseongjun 2024. 12. 24. 18:54
728x90
반응형

docker 이미지

문제 상황

1. `.env`를 이용해 docker container를 돌리던 중, `.env`파일을 교체하고 docker container를 다시 돌려야 했다.
2. 그런데 docker contanier를 단순히 `restart`하는것만으론 `.env`파일 적용이 되지 않았다.
3. 그래서 다시 container를 실행시켜야 하는데, container 내부의 db data를 유지하면서 재시작할 수 있는 방법이 필요했다.
  • docker container 내부의 data를 유지하면서, container를 삭제 후 재부팅해야함.

해결 방법

1)  현재 컨테이너에서 데이터를 볼륨으로 백업하기
docker commit {container-name} {backup-volume-name}

2) 기존 컨테이너 제거
docker rm {container-name}

3) 백업한 이미지를 기반으로 새 환경 변수를 적용하여 재실행
docker run -d --restart unless-stopped --env-file .env --name {container-name} -p 5000:8000 {backup-volumn-name}

요약하면 다음과 같다.

docker commit [컨테이너명] [백업이미지명]
docker rm [컨테이너명]
docker run [새로운 환경변수와 함께] [백업이미지명]

추가로 알게 된 것

  1. 처음부터 volume mount를 사용했다면, 그냥 container rm 후 다시 run을 해줘도 됐다.
  1. claude 답변

가장 권장되는 방법은 처음 컨테이너를 설계할 때 중요한 데이터는 볼륨 마운트를 사용하여 외부에 저장하는 것입니다. 이렇게 하면 환경 변수 변경 시 간단히 컨테이너를 재생성할 수 있습니다.

  1. 기존 container 내에 저장된 data를 volumn mount로 옮기는 법
1. 새로운 볼륨 생성
docker volume create [volumn-name]

2. 현재 데이터 백업 (임시 컨테이너 활용)
# 현재 컨테이너의 데이터를 볼륨으로 복사
# /path/to/data에 실제 경로를 넣어야 함을 유의
docker run --rm -v [volumn-name]:/backup \
  --volumes-from [container-name] \
  ubuntu \
  bash -c "cp -a /path/to/data/. /backup/"

3. 기존 컨테이너 제거 및 볼륨을 사용하여 재생성
docker stop [container-name]
docker rm [container-name]

# /path/to/data에 실제 경로를 넣어야 함을 유의
docker run -d \
  --restart unless-stopped \
  --env-file .env \
  --name [container-name] \
  -v [volumn-name]:/path/to/data \  # 데이터 저장 경로
  -p 5000:8000 \
  [docker-image-name]
728x90
반응형
LIST