written by yechoi

[docker/docker-compose] psql extension 설치(uuid-ossp) 본문

Born 2 Code/Docker, Kubernetes

[docker/docker-compose] psql extension 설치(uuid-ossp)

yechoi 2021. 7. 3. 14:32
반응형

PostgreSQL은 uuid를 자동으로 생성하는 기능이 있습니다.

그리고 TypeORM에서 @PrimaryGeneratedColumn("uuid") 데코레이터를 사용하여 uuid를 primary key로 생성할 수 있습니다.

또한, @PrimaryGeneratedColumn("uuid")은 자동으로 생성하고 저장해줍니다.

단, 해당 데이터베이스에서 uuid 생성 함수를 호출하기 위해 관련 extension(uuid-ossp)을 설치해야 합니다.

설치되어 있지 않다면 typeORM 실행시 에러가 발생합니다.

 

설치

공식 postgres docker image가 제공하는 것 이외에 추가적인 초기화를 하고 싶다면, /docker-entrypoint-initdb.d/ 폴더에 있는 스크립트를 넣어두면 됩니다.

엔트리포인트가 디폴트 postgres 유저와 데이터베이스를 생성하기 위해 initdb 를 호출하고 난 뒤, 서비스를 실행하기 이전에 추가적인 초기화를 진행하기 위해서 해당 디렉토리 안의 *.sql 또는 실행가능한 *.sh 스크립트를 실행합니다.

우리가 원하는 extension을 설치하기 위한 .sh 파일을 만들고, 이를 container 내부의 /docker-entrypoint-initdb.d/ 디렉토리에 넣어보겠습니다.

1. uuid-ossp 를 설치하는 스크립트를 init_db.sh 를 만듭니다.

  • 예시는 uuid-ossp 입니다만, 다른 원하는 익스텐션이 있으면 해당 명칭으로 대체하면 됩니다.
  • $POSTGRES_USER$POSTGRES_DB는 환경설정 파일 또는 environment 옵션으로 설정할 수 있습니다.
#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB" TO "$POSTGRES_USER";
    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

EOSQL

2. 컨테이너 내에 /docker-entrypoint-initdb.d/ 폴더를 만듭니다. /db/ 를 해당 명칭의 볼륨으로 올리는 방식으로 진행합니다.

  • docker-compose를 사용하고 있기 때문에 docker-compose 파일을 아래와 같이 설정하겠습니다.
version: '3'
services:
  db:
    image: postgres
    networks:
      - database
    ports:
      - "5432:5432"
    env_file:
      - ./db/.env
    volumes:
      - ./db/:/docker-entrypoint-initdb.d
    restart: always
    container_name: db

 

잘 설치됐는지 확인하기

1. 컨테이너에 진입: docker exec -it db /bin/bash

  • db는 실사용하는 컨테이너 이름으로 바꿔줘야 합니다.

2. 데이터베이스에 진입: psql -U user database

  • user는 실사용하는 유저 이름으로 바꿔야 합니다. 여기서 user는 env_file 에 선언된 POSTGRES_USER 입니다.
  • database는 실사용하는 데이터 베이스 이름으로 바꿔야 합니다. 여기서 database는 마찬가지로 env_file 에 선언된 POSTGRES_DB 입니다.

3. 사용가능한 익스텐션 확인: select * FROM pg_available_extensions;
아래쪽에 uuid-ossp가 있습니다.

참고:
공식 문서 - initialization scripts(en/docs).
https://github.com/transcendence42/ft_transcendence/issues/77

반응형