::: IT인터넷 :::

공식 PostgreSQL Docker 이미지에 한글 적용하기

곰탱이푸우 2022. 4. 21. 08:20
이전 포스팅에서 Docker를 이용하여 PostgreSQL을 설정하는 방법을 다뤘다.
 

 

Docker를 이용하여 PostgreSQL을 설정하는 방법은 다음 포스팅을 참고한다.
PostgreSQL이 제공하는 공식 Docker 이미지를 사용했다.
문제는 영어 기반이라 Encoding에서 한글 지원이 안된다.
이미지를 생성하는 단계에서 UTF8의 영문만 설정하고 한글 설정은 빠져있다.
따라서 en_US.utf8만 지원하고 ko_KR.utf8은 지원하지 않는다.
 
물론 PostgreSQL에서 EUC-KR을 지원한다.
그러나 다른 플랫폼이나 개발 환경과 호환을 고려하면 UTF 기반의 ko_KR.utf8을 쓰는 것이 좋다고 판단된다.

 

 

해결 방법

initDB 재실행?

initDB는 PostgreSQL을 직접 설치하는 과정에서 데이터베이스를 초기화하는 명령이다.
해당 명령을 실행하면 서비스 데몬이 실행되면서 사용 가능한 상태로 전환된다.
 
initDB가 실행되면서 지정 경로에 PostgreSQL 구성 파일들이 생성된다.
이러한 점으로 인해 initDB를 실행하고 나면 설정을 변경하는 것이 쉽지 않다.
 
PostgreSQL의 DB 데이터 생성 경로를 변경하고 새로 initDB를 실행하는 방법이 있긴 하다.
그러나 Docker 컨테이너를 실행할때 지정한 공유 볼륨이 아닌 다른 경로에 데이터가 생성된다.
공유 볼륨을 통한 데이터 백업과 복원에 불편함은 운영하는데 있어 긍정적인 부분은 아니다.
 

한글 버전 Docker 이미지 빌드

그나마 현실적인 방법은 공식 Docker 이미지에 한글을 설정하는 명령을 추가한 새로운 이미지를 만드는 것이다.
 
공식 Docker 이미지의 Dockerfile을 수정해서 ko_KR.utf8을 지원하는 이미지를 만드는 것이다.
한글 설정 이후 initDB가 실행되기 때문에 가장 확실한 방법이다.
 
그러나 PostgreSQL의 신규 버전으로 업그레이드 할 때 불편함이 존재한다.
공식 이미지는 영문 기반이기 때문에 매번 한글 버전을 생성해서 적용해야 하는 부담이 있다.
 
이 부분은 기존 GitLab + Jenkins + Nexus로 구축한 CI/CD를 통해 자동화 해두는 것을 권장한다.
Docker 이미지의 CI/CD 환경 구축은 다음 포스팅을 참고한다.

 

GitLab, Jenkins, Nexus 구축
Docker 이미지 빌드 환경 구축
 

PostgreSQL Docker 이미지 빌드

수작업으로 Docker 이미지를 빌드하고 사용하는 방법을 정리한다.
위의 포스팅을 참고하면 아래 내용을 CI/CD에 적용하는 것이 가능할 것으로 보인다.
 

Dockerfile 수정

Docker 이미지를 빌드할 경로로 이동하여 Dockerfile 파일을 생성한다.
 
아래와 같이 코드를 작성한다.
# 사설저장소를 사용하는 경우 아래 FROM 수정 필요
# FROM 사설저장소주소:포트/postgres:14.1

FROM postgres:14.1
RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
    sed -i 's/# ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen && \
    locale-gen
ENV LANG=ko_KR.utf8 \
    LC_COLLATE=ko_KR.utf8 \ 
    POSTGRES_INITDB_ARGS=--data-checksums
 
PostgreSQL의 공식  Docker 이미지인 posgres 14.1 버전을 베이스로 사용한다.
해당 Docker 이미지의 시스템의 표준 시간을 서울(Seoul)로 변경하고, Locale 설정에 UTF의 한국어 설정을 추가한다.
환경 변수의 언어 부분에 ko_KR.utf8 설정을 추가한다.
LC_COLLATE 부분은 PostgreSQL 내부에서 사용하는 설정으로, 기본 설정을 사용하고자 한다면 아래와 같이 수정한다.
LC_COLLATE="C"
 

Docker 이미지 빌드

작성한 Dockerfile을 사용하여 PostgreSQL에 한글 설정이 적용 된 Docker 이미지를 빌드한다.
 
아래 명령을 실행하면 Docker 이미지가 생성 된다.
$ docker build -t postgres-ko:14.1 .

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM postgres:14.1
---> 07e2ee723e2d
Step 2/3 : RUN ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime &&
    sed -i 's/# ko_KR.UTF-8 UTF-8/ko_KR.UTF-8 UTF-8/' /etc/locale.gen &&
    locale-gen
---> Running in 2a94ddacd457
Generating locales (this might take a while)...
  ko_KR.UTF-8... done
Generation complete.
Removing intermediate container 2a94ddacd457
---> 6a9ecfbf2164
Step 3/3 : ENV LANG=ko_KR.utf8    LC_COLLATE=ko_KR.utf8    POSTGRES_INITDB_ARGS=--data-checksums
---> Running in c292940b1dc2
Removing intermediate container c292940b1dc2
---> 2d08b4859af1
Successfully built 2d08b4859af1
Successfully tagged postgres-ko:14.1
 
이미지명 뒤에 -ko를 추가하여 한글 버전인 것을 구분했다.
 

Docker 이미지 배포

Nexus3에 생성한 Docker 이미지를 배포하는 방법은 아래 블로그를 참고한다.
 

적용 결과 확인

생성한 Docker 이미지를 컨테이너로 실행하여 한글 설정이 정상 적용 되었는지 확인한다.
 

Docker 컨테이너 생성

생성한 이미지를 사용하여 컨테이너를 생성한다.
데이터 경로는 공유 볼륨을 생성할 경로를 절대 경로로 지정한다.
$ docker run -p 5432:5432 --name sr-postgres-ko \    # PostgreSQL 포트 5432 바인딩
    -e POSTGRES_PASSWORD=POSTGRES_PASS -e TZ=Asia/Seoul \    # POSTGRES_PASSWORD 수정 필요
    -v /데이터경로/pgdata:/var/lib/postgresql/data -d \    # 공유 볼륨 경로
    postgres-ko:14.1    # 이미지명:버전

# 사설저장소를 사용하는 경우 이미지 경로 수정 필요
# 사설저장소주소:포트/postgres-ko:14.1
 

실행 결과 확인

아래 명령어로 생성한 컨테이너의 로그를 확인한다.
$ docker logs sr-postgres-ko
 
로그가 한글로 찍히는 것을 확인할 수 있다.
 

Database에 실제 적용 여부 확인

psql 실행 후 DB 목록을 확인해보면 ko_KR.UTF-8 설정이 적용 된 것을 확인할 수 있다.
 
아래 명령으로 실행한다.
$ docker exec -it -u postgres sr-postgres-ko /bin/bash

# psql
psql (14.1 (Debian 14.1-1.pgdg110+1))
도움말을 보려면 "help"를 입력하십시오.

postgres=# \l
                                데이터베이스 목록
  이름    |  소유주  | 인코딩 |  Collate  |  Ctype     |      액세스 권한
----------+----------+-------+------------+------------+-----------------------
postgres  | postgres | UTF8  | ko_KR.utf8 | ko_KR.utf8 |
template0 | postgres | UTF8  | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
          |          |       |            |            | postgres=CTc/postgres
template1 | postgres | UTF8  | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
          |          |       |            |            | postgres=CTc/postgres
(3개 행)
postgres=#