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/