フリーランスのエンジニア道

フリーランスエンジニアの不安を解消するブログ

Dockerfileでタイムゾーンを設定する方法

概要

GCPにRailsをdeployする時にDockerfileでimageをbuildすると思います。その際にDockerのデフォルトのタイムゾーンはUTCとなっているため、これをAsia/Tokyoの時間に変更したい場合の設定方法です。

 

2種類のやり方

  1. ホストの/etc/localtimeをコンテナーにマウントする
  2. 環境変数TZで指定する

 

ホストからコンテナーにマウントするとDocker Imageのポータビリティには良いですが、ほとんどの人は日本時間に固定した方がシンプルで楽だったりするので、2の環境変数で設定したいと思います。

 

環境変数での設定方法

ENV TZ='Asia/Tokyo'

 

サンプルDockerfile

Rails+Whenever(crontab)のイメージサンプルです。

FROM gcr.io/google_appengine/ruby

# Install 2.4.2 if not already preinstalled by the base image
RUN cd /rbenv/plugins/ruby-build && \
    git pull && \
    rbenv install -s 2.4.2 && \
    rbenv global 2.4.2 && \
    gem install -q --no-rdoc --no-ri bundler --version 1.15.4
ENV RBENV_VERSION 2.4.2

COPY Gemfile Gemfile.lock /app/
# Install required gems.
RUN bundle install --deployment && rbenv rehash
# Copy the application files.
COPY . /app/

# Set environment variables.
ENV RACK_ENV=$RAILS_ENV \
    RAILS_ENV=$RAILS_ENV \
    RAILS_SERVE_STATIC_FILES=true \
    TZ='Asia/Tokyo'

# Run asset pipeline.
RUN bundle exec rake assets:precompile

# Reset entrypoint to override base image.
ENTRYPOINT []

# Crontab
RUN apt-get update && apt-get install -y cron
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN touch /var/log/cron.log
RUN bundle exec whenever --update-crontab

# Start app and cron
CMD cron && bundle exec puma -C config/puma.rb && /bin/tail -f /dev/null

 

これでcronもちゃんと動きます