Dockerコンテナのタイムゾーン変更方法


TZ環境変数で変更

```
$ docker run -it --rm -e TZ=Asia/Tokyo python:3.7.4 bash
root@76b0f97a96ee:/# date
Wed Jul 17 00:03:25 JST 2019

```

docker-composeの指定方法

```
version: '3.7'
services:
  mariadb:
    environment:
      TZ: Asia/Tokyo
```


TZ環境変数で変わらないイメージがある
その時は、etc/localtimeをvolume mountでやると変わった

```
$ docker run -it --rm -e TZ=Asia/Tokyo verdaccio/verdaccio:4.1.0 sh
~ $ date
Tue Jul 16 15:06:26 UTC 2019

# etc/localtimeをvolume mountだと変わった
$ docker run -it --rm -v /etc/localtime:/etc/localtime:ro verdaccio/verdaccio:4.1.0 sh
~ $ date
Wed Jul 17 00:08:24 JST 2019

```

etc/localtimeをvolume mountして問題出る場合があるので、
以下のサイトの内容を読んだほうがよい。
[Docker で /etc/localtime をホストに volume マウントしてハマった話](https://qiita.com/jeffi7/items/9d4c85cf049644f711b8)
[Ubuntu 16.04(xenial)のDockerコンテナのタイムゾーンを日本(JST)にする(Dockerfileで)](https://qiita.com/windyakin/items/d73157966d414978b7cf#_reference-147258cb14b4d27ee3fc)

## 2019/7/29追記

**・コンテナのタイムゾーンは変更しないでそのまま使うほうがよい**

**・/etc/localtime をホストに volume マウント は、やらないほうがよい**

**・コンテナのタイムゾーンを変えたい場合、環境変数「TZ」が使えるOSなら、それを使う**
  **・ubuntu:xenial で -e TZ=Asia/Tokyo を付けて docker runしても変わらないという情報あり**
    [Ubuntu 16.04(xenial)のDockerコンテナのタイムゾーンを日本(JST)にする(Dockerfileで)](https://qiita.com/windyakin/items/d73157966d414978b7cf#_reference-147258cb14b4d27ee3fc)
  **・Alpine Linuxは、zoneinfo とかはそのままだと用意されていないので、apk で tzdata パッケージをインストールする必要があります。**
    [Alpine Linux でタイムゾーンを変更する](https://qiita.com/dtan4/items/8359e389b95cbc60952d#%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%81%AE%E8%A8%AD%E5%AE%9A)
    [Alpine Linux で timezone を変更する（最新版？）](https://qiita.com/yukin01/items/dff2c68b15b9ddf6c070)
    [Docker の Alpine Linux でタイムゾーンを JST にする](https://qiita.com/wiro34/items/565f1007d84a073bbb68) 
    [DockerのAlpine Linuxでタイムゾーンでハマった](https://abrakatabura.hatenablog.com/entry/2017/07/16/081952) 

## UbuntuのDockerコンテナのタイムゾーン変更・・・2019/11/12追記

**ubuntu:bionic(18.04)**

```:Dockerfile
FROM ubuntu:bionic
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
```

```
$ docker build . -t ubuntu-bionic
$ docker run -it --rm -e TZ=Asia/Tokyo ubuntu-bionic /bin/bash
$ date

Tue Nov 12 18:02:10 JST 2019
```

**ubuntu:disco(19.04)**

```:Dockerfile
FROM ubuntu:disco
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
```

```
$ docker build . -t ubuntu-disco
$ docker run -it --rm -e TZ=Asia/Tokyo ubuntu-disco /bin/bash
$ date

Tue Nov 12 18:24:35 JST 2019

```

**ubuntu:eoan(19.10)**

```:Dockerfile
FROM ubuntu:eoan
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
```

```
$ docker build . -t ubuntu-eoan
$ docker run -it --rm -e TZ=Asia/Tokyo ubuntu-eoan /bin/bash
$ date

Tue Nov 12 18:26:59 JST 2019
```

**ubuntu:focal(20.04)**

```:Dockerfile
FROM ubuntu:focal
RUN DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y tzdata
```

```
$ docker build . -t ubuntu-focal
$ docker run -it --rm -e TZ=Asia/Tokyo ubuntu-focal /bin/bash
$ date

Tue Nov 12 18:29:48 JST 2019
```

## 2019/7/26追記

AWS EC2
CoreOS 2135.5.0
OSのタイムゾーンはデフォルトのUTC

```docker-compose.yml
version: "3.7"
services:
  mariadb:
    container_name: mariadb
    image: mariadb:10.3.16
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-time-zone=Asia/Tokyo
    volumes:
      - ./mariadb-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: test
      TZ: Asia/Tokyo
    ports:
      - "3306:3306"
```

```
$ docker-compose up -d
$ docker exec -it mariadb bash
$ date

Fri Jul 26 02:24:41 JST 2019

$ mysql -u root -ptest

MariaDB [(none)]> SHOW VARIABLES LIKE '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```

パターン②

```docker-compose.yml
version: "3.7"
services:
  mariadb:
    container_name: mariadb
    image: mariadb:10.3.16
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-time-zone=Asia/Tokyo
    volumes:
      - ./mariadb-data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: test
    ports:
      - "3306:3306"
```

```
$ docker-compose up -d
$ docker exec -it mariadb bash
$ date

Thu Jul 25 17:31:18 UTC 2019

$ mysql -u root -ptest

MariaDB [(none)]> SHOW VARIABLES LIKE '%time_zone%';

+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```

AWS EC2
Amazon Linux2
OSのタイムゾーンはデフォルトのUTC

パターン①

```docker-compose.yml
version: "3.7"
services:
  mariadb:
    container_name: mariadb
    image: mariadb:10.3.16
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-time-zone=Asia/Tokyo
    volumes:
      - ./mariadb-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: test
      TZ: Asia/Tokyo
    ports:
      - "3306:3306"
```

```
$ docker-compose up -d
$ docker exec -it mariadb bash
$ date

Fri Jul 26 02:36:25 JST 2019

$ mysql -u root -ptest

MariaDB [(none)]> SHOW VARIABLES LIKE '%time_zone%';

+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```

パターン②

```docker-compose.yml
version: "3.7"
services:
  mariadb:
    container_name: mariadb
    image: mariadb:10.3.16
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-time-zone=Asia/Tokyo
    volumes:
      - ./mariadb-data:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: test
    ports:
      - "3306:3306"
```

```
$ docker-compose up -d
$ docker exec -it mariadb bash
$ date

Thu Jul 25 17:42:03 UTC 2019

$ mysql -u root -ptest

MariaDB [(none)]> SHOW VARIABLES LIKE '%time_zone%';

+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```

## 2019/12/10追記

Maxscaleの公式イメージを日本のタイムゾーンで動かしたい場合は、
公開されているDockerfileをgit cloneで落としてきて、Dockerfileに
「tzdata」をインストールを追記して、Dockerイメージを作成する必要が
あります。

```
# Maxscaleの公式イメージでタイムゾーンを設定してDockerコンテナ起動
docker run --name maxscale -d -e TZ=Asia/Tokyo mariadb/maxscale:2.4.4

maxscale]$ docker exec -it maxscale bash

# タイムゾーンの表示がおかしい
root@6f50b8ecd471:/# date
Mon Dec  9 16:11:15 Asia 2019
root@6f50b8ecd471:/# exit
$ docker rm -f maxscale

$ git clone https://github.com/mariadb-corporation/maxscale-docker.git
$ cd maxscale-docker
$ cd maxscale
$ vi Dockerfile
```

「tzdata」のインストールを追加

```:Dockerfile
# Dockerfile for the 2.4 GA version of MariaDB MaxScale
FROM ubuntu:bionic

ARG VERSION
ARG GIT_COMMIT
ARG GIT_TREE_STATE
ARG BUILD_TIME

COPY maxscale.list /etc/apt/sources.list.d/maxscale.list.tmp

RUN apt-get -y update && \
    apt-get -y install gnupg2 ca-certificates tzdata && \
    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys "0x135659e928c12247" && \
    mv /etc/apt/sources.list.d/maxscale.list.tmp /etc/apt/sources.list.d/maxscale.list && \
    apt-get -y update && \
    apt-get -y install maxscale && \
    rm -rf /var/lib/apt/lists/* && \
    if [ ! -z $VERSION ] && [ ! -z $GIT_COMMIT ] && [ ! -z $BUILD_TIME ]; then \
       printf "Version:    $VERSION\nGit commit: $GIT_COMMIT$GIT_TREE_STATE\nBuilt:      $BUILD_TIME\n" > /opt/image_details; fi

COPY maxscale.cnf /etc/
ENTRYPOINT ["maxscale", "-d", "-U", "maxscale", "-l", "stdout"]

COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod 755 /usr/local/bin/docker-entrypoint.sh && \
    ln -s /usr/local/bin/docker-entrypoint.sh /docker-entrypoint.sh # backwards compat
ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["maxscale", "-d", "-U", "maxscale", "-l", "stdout"]
```

```
# Dockerイメージ作成
$ docker build -t maxscale:2.4.4 .

# Dockerコンテナ起動
$ docker run --name maxscale -d -e TZ=Asia/Tokyo mariadb/maxscale:2.4.4

# 動作確認
$ docker exec -it maxscale bash
root@b01bd6dd9f47:/# date
Tue Dec 10 01:25:30 JST 2019
```