728x90
반응형
문제 상황
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 [새로운 환경변수와 함께] [백업이미지명]
추가로 알게 된 것
- 처음부터 volume mount를 사용했다면, 그냥 container rm 후 다시 run을 해줘도 됐다.
- claude 답변
가장 권장되는 방법은 처음 컨테이너를 설계할 때 중요한 데이터는 볼륨 마운트를 사용하여 외부에 저장하는 것입니다. 이렇게 하면 환경 변수 변경 시 간단히 컨테이너를 재생성할 수 있습니다.
- 기존 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