일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- build
- react 상태
- SpringBoot
- Security 로그인
- Spring Security
- react 심플캡차
- 젠킨스
- 스프링 시큐리티
- Spring Boot
- error
- react 캡차
- 스프링 시큐리티 로그인
- 스프링
- spring security 로그인
- 깃
- 리액트 심플캡차
- myBatis
- react simple captcha
- react 자동입력방지
- REACT
- maven
- 에러
- CI
- Docker
- git
- jpa
- 리액트 캡차
- ChatGPT
- react captcha
- spring error
- Today
- Total
I can do it(Feat. DEV)
[Docker-Compose]PostgreSQL 컨테이너 생성 시 DB 초기화하기 본문
평소 실제 DB 서버에서 직접 테스트할 수 없으니,
매번 DBeaver로 DB를 백업해서 SQL문을 뽑아내고
PostgreSQL 컨테이너를 띄워 데이터베이스를 초기화하고 있었는데...
반복 작업이다 보니 귀찮기도 하고 딱 컨테이너 생성할 때 DB가 세팅되면 좋겠다~ 싶어서
여러 삽질 끝에 docker-compose와 dockerfile을 사용하여 설정하는 방법을 완료했음!!
그래서 그 방법을 공유하고자 함🎉
☘️ INDEX
1. 필자의 환경 스펙 설명
2. 관련 설정 파일들 설명
- docker-compose.yml
- dockerfile
- init.sh
3. 도커 컴포즈 실행
1. 필자의 환경 스펙 설명
먼저 필자가 어떤 db툴을 쓰고 어떤 db 이미지를 사용해서 컨테이너를 띄웠는지 간략하게 설명하겠음!
Docker Image : postgres(버전은 그냥 제일 최신버전 사용)
DB Tool : DBeaver( 다운로드 링크 : https://dbeaver.io/download/)
DB : PostgreSQL(도커 컨테이너)
필자는 DBeaver로 데이터를 백업할 때 포맷 타입은 custom으로 하고 파일명은 restore.sql로 만들었음.
custom 타입으로 복원을 하면 psql로 복원할 수 없고 pg_restore 명령어를 사용해서 복원을 진행해야 함.
2. 관련 설정 파일들 설명
2-(1) docker-compose.yml : 컨테이너를 정의하고 설정하는 다양한 옵션들이 포함
먼저 도커 컴포즈 파일을 만들어서 버전, database 서비스를 정의하고
포트, 환경 변수, 볼륨, 도커 파일 설정등을 해줌.
컨테이너 실행 시 docker run ... 뒤에 붙는 옵션들을 도커 컴포즈로 설정한다고 생각하면 될 듯!!
version: '3'
services:
database:
build:
context: .
dockerfile: Dockerfile_test
image: test_image:latest
container_name: test_db
environment:
POSTGRES_DB : test
POSTGRES_USER : postgres
POSTGRES_PASSWORD : 0000
ports:
- "5432:5432"
volumes:
- ./restore.sql:/docker-entrypoint-initdb.d/restore.sql
restart: always
- Version : compose file format의 버전으로 파일의 첫 줄에 선언함. 파일의 규격에 따라 지원하는 옵션이 달라지는데, “3”이라만 적으면 3으로 시작하는 최신 버전을 사용한다는 의미
- compose 파일의 버전과 호환성을 안내한 공식 문서(https://docs.docker.com/compose/compose-file/legacy-versions/)
- Service : 여러 개의 서비스를 정의할 수 있는 섹션으로 각 서비스는 하나의 컨테이너에 해당하며, 필자는 "database"라는 서비스 하나를 정의
- Database : database라는 이름의 서비스를 정의
- Build : 도커 파일을 사용하여 이미지를 빌드할 때 설정을 정의
- Context : 도커 빌드 콘텍스트의 경로를 지정
- Dockerfile : 사용할 도커 파일의 이름을 지정(default : Dockerfile)
- Image : 이미지의 이름 및 태그를 지정
- Container_name : 컨테이너 이름을 지정
- Environment : 컨테이너 내에서 사용할 환경 변수를 정의하며, PostgreSQL 데이터베이스 설정에 필요한 변수를 지정
- POSTGRES_DB : 초기화할 DB 이름
- POSTGRES_USER : 데이터베이스 사용자 이름
- POSTGRES_PASSWORD : 데이터베이스 사용자 비밀번호
- Ports : 컨테이너 포트 설정
- Volums : 호스트와 컨테이너 간의 파일 시스템 매핑을 정의
- 필자의 경우 DB 백업 파일을 컨테이너의 특정 디렉토리에 복사함.
- Restarts : 컨테이너가 중지될 때 자동으로 다시 시작하는 옵션으로 'always'로 설정하면 항상 다시 시작됨(default : no)
2-(2) Dockerfile : 도커 이미지를 생성하는 데 사용되는 스크립트 파일
도커 컴포즈에서 설정한 build 안의 옵션들을 바탕으로 도커 파일을 작성함.
필자는 도커 컴포즈에 설정한 대로 Dockerfile_test로 파일명을 만들었음!!👍
설정을 하지 않으면 위에서 말했듯이 Dockerfile으로 파일명을 만들면 됨!!😋
FROM postgres
# restore.sql 파일 복사
COPY init.sh /docker-entrypoint-initdb.d/
COPY restore.sql /docker-entrypoint-initdb.d/
# 실행 권한 부여
RUN chmod +x /docker-entrypoint-initdb.d/init.sh
도커 파일 설정은 도커 컴포즈에 비해 비교적 간단함.
- FROM postgres : postgres라는 이미지를 기반으로 설정
- COPY a b : 명령어는 말 그대로 a라는 내 파일을 b라는 경로에 복사하겠다는 도커파일 명령어임(경로 설정 주의!)
- RUN : 이미지 빌드 시 실행할 명령어를 지정하는데 필자는 init.sh 파일의 권한을 변경하는 명령어를 설정함.
2-(3) init.sh : PostgreSQL 데이터베이스를 pg_restore 명령어를 사용하여 복원하는 역할
init.sh 파일은 필자가 만든 커스텀 bash 스크립트임😋
다른 설정이 필요하다면 추가하셔도 무방함!
#!/bin/bash
set -e
echo "Running pg_restore"
# SQL 스크립트 실행
pg_restore -U "$POSTGRES_USER" -v -d "$POSTGRES_DB" /docker-entrypoint-initdb.d/restore.sql
- #!/bin/bash : 이 스크립트가 Bash 셸에서 실행되어야 함을 정의(모든 bash 스크립트는 이 줄로 시작해야 함)
- set -e : 옵션 설정으로 에러가 발생했을 때 이후의 명령어들이 실행되지 않도록 함.
- echo "" : "" 안의 메세지 출력(print랑 똑같음)
- pg_restore : postgreSQL DB를 복원하는 명령어
- $POSTGRES_USER, POSTGRES_DB : 도커 컴포즈에 설정된 환경 변수를 가져옴.
- -U : postgreSQL 사용자 이름 설정
- -v : 상세 모드로 실행하여 복원 과정의 자세한 에러 표시
- -d : DB 이름 설정
- /docker-entrypoint-initdb.d/restore.sql : 복원할 SQL 파일 경로로 컨테이너의 경로임.
추가적으로 도커의 docker-entrypoint-initdb.d 경로는 PostgreSQL Docker 이미지에서 초기화 스크립트와 SQL 파일을 자동으로 실행하는 데 사용되는 경로임.
즉 자동으로 restore.sql 파일을 실행시켜 복원이 진행되어야 하지만!!
위에서 언급했다시피 restore.sql 파일은 커스텀 타입이라 pg_restore 명령어를 사용하여 복원을 진행해야만 하기 때문에!!
위 방법처럼 init.sh라는 커스텀 스크립트를 만들어서 설정을 진행함!!😋
혹시 더 좋은 방법이 있다면 공유 부탁함!!👍
3. 도커 컴포즈 실행
위 설정을 모두 진행했다면 이제 도커 컴포즈를 실행시키면 되는데!!
필자는 vscode를 사용하여 도커 환경을 설정했기 때문에
vscode 터미널에서 git bash로 아래 명령어를 실행함.
docker-compose up -d # 도커 컴포즈 실행 명령어
docker-compose ps # 현재 실행중인 서비스의 상태 확인 명령어
docker-compose logs # 서비스의 로그 확인 명령어
문제가 없다면

도커 데스크톱에서 컨테이너 목록에 초록색으로 컨테이너가 실행되는 것을 확인할 수 있음!!
진행하다 혹시
bash: init.sh: cannot excute: required file not found
에러가 뜬다면 ~~
Linux Bash Shell Script Error: cannot execute: required file not found
I have two similar scripts with different names. One works fine but other throws error. Can anyone please tell me what is the issue? This is my test.sh scripts which works fine [nnice@myhost Script...
unix.stackexchange.com
이 해결방법을 참고해서
notepad++ 프로그램을 사용해 줄 끝 문자 형식을 Unix(LF)로 변경해서 저장 후 다시 실행해 보길!!
필자는 위 해결방법으로 에러를 해결했음!!😋
혹시 몰라 notepad++ 다운로드 링크(https://notepad-plus-plus.org/downloads/)
지금까지 도커 컴포즈를 이용해 postgreSQL 데이터베이스 초기화 방법이었음!!
다들 행복한 하루 보내시길!👋
'개발자 모드 > 응용' 카테고리의 다른 글
[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[2편] (0) | 2024.09.12 |
---|---|
[CI/CD] Docker로 Jenkins Server 설치 및 실행(Feat. 우분투)[1편] (2) | 2024.09.11 |
[GIT] 깃헙 README 3D 잔디 심기 (0) | 2024.07.09 |
[Bat] 배치 파일로 간단하게 JDK 버전 전환하기! (2) | 2024.04.04 |
[Python] ChatGPT를 사용한 파이썬 스크립트 작성 (0) | 2024.02.29 |