DockerでのLAMP環境構築手順(Amazon Linux 2/PHP8.1(Laravel9)) ⑤timezone, localeの設定(全8回)

# はじめに

かくかくしかじかで、Docker で Amazon Linux 2 ベースの LAMP 環境を構築する機会がありましたので、手順についてアウトプットします。
![スクリーンショット 2022-11-30 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/930bcd24-38e9-316e-bebd-cef83aea5924.png)

全 8 回を予定しています。

[① 作成する環境の確認](https://qiita.com/ryamate/items/47183e1ffd4843ef18fa)
[② Apache の導入](https://qiita.com/ryamate/items/e5ca19aece61717b6a01)
[③ PHP 8.1 系のインストール](https://qiita.com/ryamate/items/7a38eb11d64d504a7a22)
[④ Composer のインストール](https://qiita.com/ryamate/items/a8bbd003c6c2abceedc9)
**⑤ timezone, locale の設定**
[⑥ docker-compose.yml の作成（MySQL の導入）](https://qiita.com/ryamate/items/ac52b152757141f443e3)
[⑦ Laravel 9 系のインストール](https://qiita.com/ryamate/items/79875e22906cfb51af67)
[⑧ Apache の設定ファイルの追加](https://qiita.com/ryamate/items/18747f5241df487ea497)

今回は、 **⑤ timezone, locale の設定** についてです。

## 環境

以下の Docker 環境を構築します。

- Amazon Linux 2
- Apache 2.4
- MySQL 8.0.28
- PHP 8.1.x
- Laravel 9.x

## 目次

[1. timezone, locale](#1-timezone-locale)
[2. Dockerfle の編集](#2-dockerfle-の編集)
[3. Docker イメージとコンテナの再作成](#3-docker-イメージとコンテナの再作成)

# 1. timezone, locale

timezone と locale について確認します。

## 1-1. timezone

タイムゾーン（timezone）には、「協定世界時」（UTC：Universal Time Coordinated）や、日本であれば、UTCに9時間を足した「日本標準時」（JST：Japan Standard Time）があるため、Dokcer コンテナ内のシステムの時刻が日本の時刻になるように JST に設定します。

https://linuc.org/study/knowledge/333/

## 1-2. locale

> **ロケール**は、ユーザーインターフェイス用の言語別または国別の基本設定のセットです。
> 
> 
> プログラムは、ロケール設定をホストシステムの言語から引き出します。とりわけ、ロケールは、指定された地域のプロトコルに従って、用紙サイズ、通貨、日付書式、および数値を表します。
> 

https://developer.mozilla.org/ja/docs/Glossary/Locale

# 2. Dockerfle の編集

Dockerfle を編集します。

## 2-1. Dockerfile の確認

前回（④ Composer のインストール）までの Dockerfile を確認します。

```docker:infra/docker/php/Dockerfile
FROM amazonlinux:2

RUN yum update -y \
  && yum install -y \
  vim \
  httpd

RUN amazon-linux-extras install -y epel
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

RUN yum clean metadata \
  && yum install -y \
  php81 \
  php81-php \
  php81-php-mbstring \
  php81-php-pdo \
  php81-php-xml \
  php81-php-fpm \
  php81-php-mysqlnd \
  php81-php-gd

RUN alternatives --install /usr/bin/php php /usr/bin/php81 1

# composer のインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

CMD [ "apachectl", "-D", "FOREGROUND" ]
```

## 2-2. Dockerfile の編集

前回に引き続き、 Dockerfile の編集は、以下のリポジトリを参考にします。

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

Dockerfile を編集します。

```diff_docker:infra/docker/php/Dockerfile
FROM amazonlinux:2

+ # timezone environment
+ ENV TZ=Asia/Tokyo \
+   # locale
+   LANG=ja_JP.UTF-8 \
+   LANGUAGE=ja_JP:ja \
+   LC_ALL=ja_JP.UTF-8

RUN yum update -y \
  && yum install -y \
+   glibc-langpack-ja \
  vim \
  httpd

RUN amazon-linux-extras install -y epel
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

RUN yum clean metadata \
  && yum install -y \
  php81 \
  php81-php \
  php81-php-mbstring \
  php81-php-pdo \
  php81-php-xml \
  php81-php-fpm \
  php81-php-mysqlnd \
  php81-php-gd

RUN alternatives --install /usr/bin/php php /usr/bin/php81 1

# composer のインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

CMD [ "apachectl", "-D", "FOREGROUND" ]
```

timezone, locale に関する下記の記述を追記しました。

```docker
# timezone environment
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8
```

```docker
  glibc-langpack-ja \
```

`TZ=Asia/Tokyo` と記述することで、「日本標準時」（JST）に設定されます（なお、 `TZ=JST` としても時刻は「協定世界時」（UTC）のままで、反映されませんでした）。

yum で `glibc-langpack-ja` をインストールすることで、ロケールに日本語を設定できるようになります。

# 3. Docker イメージとコンテナの再作成

Docker コンテナを削除し、 Docker イメージを作り直して、 Docker コンテナを作成・起動します。

## 3-1. Docker イメージとコンテナの再作成

Docker コンテナを削除します。

```bash
docker container rm -f advent-calendar
```

Docker コンテナを作成・起動します。
※ Dockerfile を infra/docker/php ディレクトリに移動させたので、以下を実行するときは階層を移動します

```bash
docker image build -t advent-calendar/advent-calendar:latest . 
docker container run -d --name advent-calendar -p 8080:80 advent-calendar/advent-calendar:latest
```

## 3-2. Composer のインストール成功の確認

Docker コンテナの中に入ります。

```bash
docker container exec -it advent-calendar /bin/bash
```

時刻を確認するために、 `date` コマンドを実行します。

```bash
date
```

```bash:実行時ログ
# r_yamate @ mbp in ~/Documents/code/advent-calendar on git:backend x [17:41:40]
$ docker compose exec web /bin/bash
bash-4.2# date
2022年 11月 23日 水曜日 17:41:47 JST
bash-4.2#
```

Docker コンテナ内の時刻が日本標準時に設定されていることが確認できました。

また、日本語で表記されており、日本語の設定もうまくいっていることが伺えますが、 locale コマンドでも確認します。

```bash
locale
```

```bash:実行時ログ
bash-4.2# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=ja_JP.UTF-8
```

言語のほか、色々な設定が日本語に合わせた設定になったようです。

https://www.ibm.com/docs/ja/aix/7.2?topic=locales-understanding-locale-environment-variables

# おわりに

今回は、 **⑤ timezone, locale の設定** についての手順でした。

次回は、 **[⑥ docker-compose.yml の作成（MySQL の導入）](https://qiita.com/ryamate/items/ac52b152757141f443e3)** の手順です。

ありがとうございました。

## 参考にしたサイト

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

https://linuc.org/study/knowledge/333/

https://developer.mozilla.org/ja/docs/Glossary/Locale

https://www.ibm.com/docs/ja/aix/7.2?topic=locales-understanding-locale-environment-variables