Docker 도커 컨테이너 안에 TimeZone을 Dockerfile으로 셋팅하기

개발을 진행하다 보면 컨테이너 안의 TimeZone을 UTC 기준이 아닌 다른 시간대로 설정해야 하는 상황이 생깁니다. 컨테이너를 생성하면서 TimeZone을 변경하는 방법은 Dockerfile를 수정하면 됩니다.


저는 NodeJS을 사용하기 때문에 Base 이미지를 node로 하도록 하겠습니다.


일단 TimeZone을 셋팅하지 않은 상태에서 시간을 측정해보겠습니다.


먼저 간단한 서버를 작성합니다. (index.js)

const http = require("http")

const host = "localhost"
const port = 8000

const requestListener = function (req, res) {
res.writeHead(200)
res.end("My first server!")
}

const server = http.createServer(requestListener)
server.listen(port, host, () => {
console.log(`Server is running on http://${host}:${port}`)
})




먼저 일반 node 이미지로 작성한 Dockerfile입니다.


# Base 이미지를 사용합니다.
# FROM node:20.10.0
FROM node:20.10.0

# 코드들을 도커 이미지로 이동시킵니다.
COPY . .

# 서버의 노출된 포트를 표시한다
EXPOSE 8000

# nodejs 서버를 실행한다.
CMD ["node", "index.js"]


해당 Dockerfile을 기준으로 이미지를 생성합니다.


해당 이미지를 기준으로 컨테이너를 생성하고 컨테이너 내의 시간을 확인합니다.


위 터미널에서 나온것과 같이 UTC시간이 Default인것을 알수 있습니다.



바뀐 Docker파일을 이용하여 다시 컨테이너를 만들도록 하겠습니다.


# Base 이미지를 사용합니다.
# FROM node:20.10.0
FROM node:20.10.0

# apt-get을 이용하여 시간을 설정한다.
RUN apt-get update && \
apt-get install -yq tzdata && \
ln -fs /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \
dpkg-reconfigure -f noninteractive tzdata

# 코드들을 도커 이미지로 이동시킵니다.
COPY . .

# 서버의 노출된 포트를 표시한다
EXPOSE 8000

# nodejs 서버를 실행한다.
CMD ["node", "index.js"]




위 사진과 같이 해당 container시간은 KST로 바뀐것을 알수 있다. 하지만 node의 경량 버전인 Alpine을 사용하게 되면 apt-get을 사용할수 없다. 이때는 아래와 같이 Dockerfile을 작성해야 한다.


# Base 이미지를 사용합니다.
# FROM node:20.10.0
FROM node:20.10.0-alpine

# Install tzdata package
RUN apk add --no-cache tzdata

ENV TZ="Asia/Seoul"

# 코드들을 도커 이미지로 이동시킵니다.
COPY . .

# 서버의 노출된 포트를 표시한다
EXPOSE 8000

# nodejs 서버를 실행한다.
CMD ["node", "index.js"]





Alpine을 사용하고도 시간이 정상적으로 변경된 것을 알수 있습니다.


gitHub Link : https://github.com/Alex-Choi0/Docker_Change_TimeZone_Images.git


댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)