2021年11月25日木曜日

docker mysql用docker-compose.ymlの記述

 私なりのmysql用のdocker-compose.ymlの記述を決めました。

ここに至る経緯は、なかなか大変でした。



ファイル構成


docker-compose.yml

mysql/Dockerfile

mysql/mysql.env

mysql/conf/my.cnf

mysql/init/01_create_tables.sql



mysql.env


MYSQL_ROOT_HOST=%

MYSQL_ROOT_PASSWORD=パスワード

MYSQL_USER=ユーザー名

MYSQL_PASSWORD=パスワード

MYSQL_DATABASE=データベース名



docker-compose.yml

一部、抜粋

services:

  mysql:

    build:

      context: .

      dockerfile: ./mysql/Dockerfile

    container_name: コンテナ名

    env_file: ./mysql/mysql.env

    environment:

      - TZ=Asia/Tokyo

    expose: 

      - "3306"

    restart: always

    volumes:

      - mysqldata:/var/lib/mysql



Dockerfile


FROM mysql:8.0

COPY ./mysql/conf/* /etc/mysql/conf.d/

COPY ./mysql/init/* /docker-entrypoint-initdb.d/




ファイルの扱い

最初、Dockerfileを用意せず、docker-compose.ymlファイルのvolumesに、my.cnfファイルなどを記述していました。

例えば、

./mysql/conf:/etc/mysql/conf.d/:ro


この場合、コンテナ起動時に、my.cnfファイルが読まれず、エラーが発生しました。

ファイルのパーミッションを変更するか、コンテナ内のmysqlユーザーのUIDを、ファイル所有者と一致させるかすれば、エラーを回避できます。


しかし、この方法は、docker-compose buildを実行する前に、ファイルパーミッションの変更作業か、ファイル所有者のUIDを.envファイルに書き込む手間が必要になります。

後者は、工夫すれば、不要かもしれません。


windowsのWSLで開発し、linuxで実行することを考え、このあたりの処理を不要にするため、コンテナ内に、ファイルをコピーする方法で回避しました。




文字コードの設定


mysqlのコンテナでは、文字コードをutf8mb4に変更する必要があります。

mysql 8.0では、デフォルトの文字コードだと思っていましたが、コンテナでは、latain1になるので、設定変更が必要でした。


この変更は、my.cnfファイルを用意するか、docker-compose.ymlのcommand項目で設定できます。


my.cnfファイルの方が見やすくなるため、こちらの方法を採用しました。


他にも、ポートの公開方法、タイムゾーンの設定など、方法が複数ある中で、上記の記述を選びました。

2021年11月17日水曜日

Docker MySQL

 MySQLのDockerコンテナを動かせました。

これまでも、動かしてはいましたが、設定に誤りがあり、正常には動いていませんでした。


my.cnfファイルのファイル名の問題。

このファイル名を、my.confと、間違っていました。

これにより、このファイルの設定は、コンテナに影響を与えない意味のない設定になっていました。

後で、分かったことですが、このファイルの記述に誤りがありました。

この影響で、my.confというファイル名の時には、設定が無視されることで、コンテナを起動できたのに、my.cnfに変えて、設定が有効になることにより、設定のミスから、コンテナを起動できませんでした。

ファイル名を間違えていたことで、動いていたという、なんともな話でした。


my.cnfの設定ミスは、下記の1行でした。

lower_case_table_names=1


過去のデータベースは、Windowsで動かしていて、Linuxへの移行中です。

Windowsのプログラムでは、テーブル名などに、大文字を使っていて、そこから、小文字へ統一しつつある過渡期です。

データベースで、大文字、小文字の区別があると、Windowsでは動くのに、Linuxでは動かないことになりますから、この設定で、大文字、小文字を区別しないのは助かる機能だと思いました。

しかし、これを設定すると、コンテナが起動しません。

この設定は、諦めることにしました。


わずか、これだけのことですが、これに気づくのに、長い時間が掛かりました。


2021年11月15日月曜日

Docker Windowsでは難しい

VMwareの仮想マシンで、開発環境を構築してきましたが、 Dockerでの開発環境に取り組んでいます。

Windowsに、WSLを導入し、dockerを使っていますが、この環境で動く、docker-compose.ymlが、ubuntuに持っていくと動きません。

原因は、主に、ファイルのパーミッションです。

docker内のユーザーと、ホストのユーザーが異なるため、アクセスできるように、設定を気をつけないと、ubuntuでは動きません。

ユーザーは、

・ホスト?側のファイルを所有するユーザー

・dockerを起動するユーザー

・コンテナ内で、サービスを起動するユーザー

この3つが関わるため、面倒でした。

ファイルの所有ユーザーと、コンテナ内のユーザーの違いについては、情報を、よく見かけますが、dockerのコンテナを起動するユーザーは盲点でした。

*.envで、環境変数(コンテナ内のデータベースのユーザー名、パスワード)を管理しますが、このファイルが、コンテナ内に反映されず、悩みました。

面倒なので、関係のあるフォルダは、下記のコマンドで読み込み権限を与えて解決しました。

$ chmod +r -R フォルダ名

セキュリティを考えれば、UIDを一致させるなどした方が良さそうですが、妥協しました。


また、mysqlでは、my.confとmy.cnfの名前の違いも考慮する必要がありました。


おそらく、ubuntu側で、dockerファイルを作成し、windowsに持っていく流れであれば問題ないと思いますが、逆は、はまりました。


2021年11月12日金曜日

HTML checkbox プログラムで値を設定できない

 HTMLのcheckbox

<input type="checkbox" id="foo" checked>


これを、プログラムで、値を設定しようとして、できませんでした。


const elements = document.getElementsById("foo");

elements.checked = false;


このような感じで、true、falseを設定すれば、通常は、チェックのオン、オフができます。
しかし、Promise内で、非同期で行ったところ、表示は変わりませんでした。内部で保持されている値は変更されるので、formで、データを送ると、変更は反映されています。
どうやら、表示だけ変わらないようです。

どの言語?か忘れましたが、画面を構成するパーツについて操作するときは、画面操作のスレッドで行わなければならなかったように思います。
Javascriptのことだっけ?と、調べてみましたが、その情報は見つかりませんでした。

内部データが、表示に反映されていないようでしたので、refresh的な、メソッドがないか調べてみましたが見つかりません。

そもそも、checkedの属性は、初期設定に使うもので、後から、プログラムで変更するのは良くない処理なのかもしれません。
属性、プロパティも調べましたが、結局、あきらめました。
プログラムで変える方法があるとすれば、create系で、DOM構造を構築すれば良いかもしれないと考えています。

今回の解決策は、サーバー側で、check状態を設定します。