Dockerを使って、Alpineのタイムゾーンを設定してみた

Dockerの公式ベースイメージとなっている[Alpine](https://alpinelinux.org/)でJSTのタイムゾーンを設定してみた。

参考にしたのはこちら
https://wiki.alpinelinux.org/wiki/Setting_the_timezone

# デフォルトでの日時を確認する

下記のdocker-compose.ymlを作成して、

```docker-compose.yml
version: '3'
services:
  timezone:
    image: alpine:3
```

シェルでコンテナに入る

```:sh
$ docker-compose run timezone sh
```

dateコマンドで、日時を表示

```:sh
# date
Mon Sep 23 08:49:05 UTC 2019
```

UTC時間が表示されている

# tzdataをインストールする

```:sh
# apk add tzdata
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/1) Installing tzdata (2019b-r0)
Executing busybox-1.30.1-r2.trigger
OK: 9 MiB in 15 packages
```

タイムゾーンの設定値が記載されている、zoneinfoディレクトリが作成された。

```:sh
# ls /usr/share/zoneinfo
Africa        Australia     Cuba          Etc           GMT+0         Iceland       Kwajalein     NZ            Poland        UCT           Zulu
America       Brazil        EET           Europe        GMT-0         Indian        Libya         NZ-CHAT       Portugal      US            iso3166.tab
Antarctica    CET           EST           Factory       GMT0          Iran          MET           Navajo        ROC           UTC           posixrules
Arctic        CST6CDT       EST5EDT       GB            Greenwich     Israel        MST           PRC           ROK           Universal     right
Asia          Canada        Egypt         GB-Eire       HST           Jamaica       MST7MDT       PST8PDT       Singapore     W-SU          zone.tab
Atlantic      Chile         Eire          GMT           Hongkong      Japan         Mexico        Pacific       Turkey        WET           zone1970.tab
```

ちなみにインスール前はディレクトリがないよって怒られる

```:sh
# ls /usr/share/zoneinfo
ls: /usr/share/zoneinfo: No such file or directory
```

# /etc/localtimeファイルを作成して、JSTのタイムゾーンを設定する

/etc/localtimeファイルを作成して、/usr/share/zoneinfo/Asia/Tokyoの内容をコピーする。

```:/usr/share/zoneinfo/Asia/Tokyo
TZif2^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@^@^@^@^@       ^@^@^@^D^@^@^@^L.^@^@^@.>^Bp..Y....p..;..^G^@...^].........^C^A^B^A^B^A^B^A^B^@^@.^C^@^@^@^@..^A^D^@^@~.^@
JST-9
```

初めの行はよくわからない...
文字化けしているのか？

> JST-9

UTCとJSTの差の9時間を表しているのかな？

```:sh
# cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

```:/etc/localtime
TZif2^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^D^@^@^@^D^@^@^@^@^@^@^@       ^@^@^@^D^@^@^@^L.^@^@^@.>^Bp..Y....p..;..^G^@...^].........^C^A^B^A^B^A^B^A^B^@^@.^C^@^@^@^@..^A^D^@^@~.^@
JST-9
```

`/etc/localtime`が作成されて、内容もコピーされてる

# タイムゾーンを設定する

```:sh
# echo "Asia/Tokyo" >  /etc/timezone
```

```:/etc/timezone
Asia/Tokyo
```

ちゃんと設定されてる

# dateで時間を確認してみる

```:sh
# date
Mon Sep 23 17:55:57 JST 2019
```

JST時間で表示されている

# 後片付けで、tzdataをアンインストールする

```:sh
# apk del tzdata
(1/1) Purging tzdata (2019b-r0)
Executing busybox-1.30.1-r2.trigger
OK: 6 MiB in 14 packages
```

```:sh
# ls /usr/share/zoneinfo
ls: /usr/share/zoneinfo: No such file or directory
```

ちゃんとアンインストールできた。

# おまけ

環境変数TZでdockerfileやdocker-compose.ymlでタイムゾーンを設定したい場合は、
tzdataをアンインストールせずにすると設定できる
(アンインストールしていると設定しても反映されなかった)

## dockerfileで環境変数TZを設定する

```dockerfile:dockerfile

FROM alpine:3

RUN apk add tzdata
ENV TZ=Asia/Tokyo
```

```docker-compose.yml
version: '3'
services:
  timezone:
    build: ./
```

```:sh
$ docker-compose build
```

```:sh
$ docker-compose run timezone sh
```

```:sh
# date
Mon Sep 23 18:51:33 JST 2019
```

## docker-compose.ymlで環境変数TZを設定する

```dockerfile:dockerfile
FROM alpine:3

RUN apk add tzdata
```

```docker-compose.yml
version: '3'
services:
  timezone:
    build: ./
    environment:
      TZ: Asia/Tokyo
```

```:sh
$ docker-compose build
```

```:sh
$ docker-compose run timezone sh
```

```:sh
# date
Mon Sep 23 19:00:33 JST 2019
```

# 終わり

タイムゾーン奥が深い