Docker
なんか毎回「あーはいはいOSのTZ環境変数設定してなかったねー」で済ましては改善せずに英文読み直すことになるのでメモ(最初から英文読め)。
以下を記述した php.ini をdockerイメージ内に配置。Dockerイメージ内既存のphp.iniを上書きしていないかどうかは事前に確認すること。
php.ini:
[Date]
date.timezone = Asia/Tokyo
Dockerfile:
COPY ./php.ini /usr/local/etc/php/
どっとはらい。
Docker の mysql でMySQLサーバを起動して、Rails環境のほうが既存コードで開発環境でも一般ユーザを作ってDBアクセスする仕組みにしていたので、 MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD を使ってDBとユーザを自動で作らせようとしたのだけど…ハマった。
Rails側が app、DB側が db と思いなせぇ。
取り敢えずMigrationエラー出るのは承知でRails側を起動させ、アクセスしてみたところ、以下のエラーが発生。
app_1 | Mysql2::Error::ConnectionError (Access denied for user 'user'@'test_app_1.test_default' (using password: YES)):
もちろんパスワードとかは合ってる。アクセス拒否されたユーザ名のホスト名部分が test_app_1.test_default
となっているのだけど、当初ここを「アクセス先」と誤認してしまい、 DBコンテナのホスト名がどこかで混線してる??? と考えてあちこち弄ったりデバッグコード仕込んでみたりして調べること、約1日。
ちがうよねー
これはアクセス元(app)のホスト名が、MySQL側に登録されていないので拒否られているのよねー。
で。気付いたので MYSQL_USER を user@test_app_1.test_default
にしてみたり(これだと docker-compose run するたびにホスト名が変わるのでよろしくない)、 user@%
にしてみたり(というか元々こうなる気がするんだが…)したのだけど、結局うまく行かず、面倒くさいので Rails 側のDBユーザ名を root に変えてしまいましたとさ。
どっとはらい。
…まあ、後々必要になりそうな気もするので、今度どのように書くのが良いのか、ちゃんと調べようかと(今はただRailsアプリの動作環境を作ってコーディングをせねばならぬ)
そんな平成最後の年度末。
Dockerfile の ARG に対する値入力
--build-arg <変数名>=<値>
複数の場合は1つずつ。
--build-arg <変数名1>=<値> --build-arg <変数名2>=<値>
Docker外とDoker内で作業ユーザを一致させたい
この方法が本当に最適解なのかは分からないが。Doker内に既存の一般ユーザが居ない前提。
docker buildへの指定:
--build-arg USER_ID=`id -u` --build-arg USER_GROUP_ID=`id -g` --build-arg USER_NAME=`id -un`
Dockerfile内:
ARG USER_ID ARG USER_GROUP_ID ARG USER_NAME RUN groupadd -g $USER_GROUP_ID $USER_NAME \ && useradd -u $USER_ID -g $USER_NAME -m $USER_NAME
さらに作業ディレクトリVOLUMEを作業ユーザで使えるようにする
Dockerfile内:
RUN mkdir -p /mnt/work_dir_root/workarea && chown -R $USER_NAME:$USER_NAME /mnt/work_dir_root/workarea VOLUME /mnt/work_dir_root USER $USER_NAME
VOLUMEに書いたディレクトリ直接だと(マウントポイントなので)chownが使えないので、さらに一段掘って作業エリアとする。
オンラインの参考資料 (Docker ドキュメント日本語化プロジェクト)