docker container [mysql] 9시간 전으로 나오는 문제 해결하기

임현규·2023년 4월 19일
0

Meca project 개발 일지

목록 보기
16/27

9시간 전으로 나오는 문제

docker를 활용해서 application을 실행하는데 등록 api 요청시 createdAt과 modifiedAt 속성이 모두 9시간 전으로 나왔다. 이것은 TimeZone이 Asia/Seoul로 설정되지 않아서 발생하는 문제이다. 이를 해결해야 한다

Mysql 컨테이너의 Timezone을 맞추기

sql에 저장해야 하므로 sql의 시간을 대한민국 서울 표준시로 설정이 되야 할 것이다. 이를 해보자

1. docker container에서 mysql 시간 설정하기

mysql에서 timezone을 설정할 수 있다. 나는 인스턴스에서 docker-compose를 활용하고 있으므로 이를 활용해 timezone을 설정해보자

# application.yml
 sql-db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ~~~~~~
      MYSQL_DATABASE: ~~~~~~
      TZ: Asia/Seoul
    volumes:
      - db_data:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci

sql-db라는 컨테이너에 image를 mysql를 사용한다. 이 때 environment에서 TZ가 있는데 이것은 timezone을 설정하는 곳이다. 이를 Asia/Seoul로 설정한 후 docker-compose를 실행해주면 된다.

2. 제대로 적용되었는지 확인하기

docker-compose exec -it sql-db bash

해당 명령어를 사용하면

다음과 같이 창 좌측에 bash라고 뜨며 sql 컨테이너와 상호작용할 수 있다.

여기서 date를 입력하면

KST로 성공적으로 적용됬음을 알 수 있다.

Java 실행 옵션에 timezone을 활용하기

java를 실행할 때 timeZone을 주는 것이다. 이를 활용하면 java application 실행시 default로 time zone이 Asia/Seoul로 설정되어 db에 저장할 때 시간이 정확하게 반영 될 수 있다.

1. java application docker image build 하기

우리가 원하는 자바 어플리케이션 컨테이너를 얻기 위해서는 필요한 image를 빌드해야 한다.

FROM openjdk:11-jdk-slim

WORKDIR /app

COPY build/libs/meca-0.0.1-SNAPSHOT.jar app.jar

ENV SERVER_MODE default
ENV PORT 8000
ENV LOCATION "/"

ENTRYPOINT ["java","-Dserver.port=${PORT}","-Dspring.profiles.active=${SERVER_MODE}", "-jar", "app.jar", "--spring.config.location=${LOCATION}", "-Duser.timezone=${TZ}"]

ENTRYPOINT를 정의함으로써 image의 env를 통해 jar를 실행 옵션을 컨테이너에서 활용할 수 있다.

"-Duser.timezone=${TZ}" 와 같이 설정해두면 docker에서 env에 TZ=Asia/Seoul를 설정하면 java application의 time zone은 KST로 설정될 것이다.

2. docker-compose.yml을 java-application 실행하기

java-api-server:
    image: limhyeongyu/meca
    ports:
      - "~~~~:~~~~"
    environment:
      PORT: ~~~~
      LOCATION: /app/config/application.yml
      TZ: Asia/Seoul
    depends_on:
      - sql-db
    volumes:
      - /home/ubuntu/config:/app/config

여기서 TZ를 Asia/Seoul로 설정하면 시간이 TimeZone으로 설정된다.

실제 시간이 잘 동기화 되는지 테스트해보기

현재 윈도우에 표시된 시간과 postman에서 저장 요청에 대한 응답의 생성 시간과 일치한다면 정확하게 잘 설정된 것이다. 이를 테스트 해보자

응답 결과 23-04-20 그리고 오전 12:36 == 00:36으로 일치함을 알 수 있다.

profile
엘 프사이 콩그루

0개의 댓글