datasource로 postgres를 연결하고 작업중에 아래와 같은 에러메시지가 뜨는 경우가 있다.
Could not resize shared memory segment “/PostgreSQL.2018052794” to 40935124 bytes: No space left on device
원인
postgres의 Shared Memory(SHM) 설정이 64mb로 되어있다.
해결
postgres의 SHM 설정 크기를 늘려주면 된다.
방법
docker-compose를 이용하여 postgres를 설치하는 경우로 설명한다.
아래는 docker-compose 파일 내용이다.
services:
postgres:
image: postgres:11.3
container_name: postgres
shm_size: 1gb
ports:
- 5432:5432
volumes:
- ./initdb.d/:/docker-entrypoint-initdb.d/
- postgres:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user_id
- POSTGRES_PASSWORD=password
- POSTGRES_DB=db_name
restart: always
networks:
- network_optional
위와 같이 shm_size 옵션을 포함해주고 원하는 크기를 입력하면 된다.
예시에서는 넉넉하게 1기가로 설정했다.
설정 후 docker-compose down, up 을 다시 하면 해결된다.
docker-compose에 대한 부연 설명
주석을 좀 달자면,
services:
postgres:
#postgres 버전은 11.3을 적용했다.
image: postgres:11.3
#container 이름은 따로 설정하지 않으면 docker-compose 파일이 포함된 폴더명을 참조하여 자동으로 생성된다.
container_name: postgres
#Shared memory 설정
shm_size: 1gb
#5432:5432 로 설정하면 5432포트로 접근했을때 postgres 컨테이너에 5432로 접근가능하다.postgres의 기본 포트는 5432이다.
ports:
- 5432:5432
volumes:
#docker-compose 파일이 위치한 폴더에 initdb.d(폴더명은 자유) 폴더를 만들고 그안에 테이블 생성 쿼리 파일을 넣고 docker-entrypoint-initdb.d에 마운트하면
#해당 쿼리가 docker-compose up 할때 실행되며 초기 테이블 생성이 가능하다.
- ./initdb.d/:/docker-entrypoint-initdb.d/
#아래처럼 설정하면 postgres라는 볼륨을 생성하고 /var/lib/postgresql/data 내용이 저장된다. 컨테이너가 중지되었다 다시 실행되어도 db를 보존할수 있다.
- postgres:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user_id
- POSTGRES_PASSWORD=password
- POSTGRES_DB=db_name
#컨테이너 자동시작 옵션.
restart: always
networks:
#다른 컨네이너와 연결이 필요하다면 같은 network이름으로 묶어주면 된다.
- network_optional
참고
컨테이너 다시 안 만들면서 shm 설정 바꾸는 방법까지 소개된 링크
https://medium.com/@lk.snatch/postgresql-no-space-left-on-device-20248e94d623
컨테이너 자동 시작 옵션 관련
https://docs.docker.com/config/containers/start-containers-automatically/
0 댓글