前回、Docker Composeで始める複数人プロジェクトで、共有しやすいRails開発環境を作った(たぶん) を書きましたが、この時の構成より良い方法があったので、アプデしました。

したこと

mariadbのコンテ周りを中心に見直すPR でdocker-composeの構成を見直しました。

一番大きな変更

# docker/mariadb/Dockerfile 
FROM mariadb:latest
RUN usermod -u 1000 mysql
RUN mkdir -p /var/run/mysqld
RUN chmod -R 777 /var/run/mysqld

を削除して、 docker-compose.yml 側で

rails_db:             
  image: mariadb:10.0 

とイメージを直接取得するように変更した事

なんで削除?

もともとは、docker-compose v1時代に、MySQLのデータ永続化としてと、Docer hostの容量問題を考えて、ローカルディレクトリを /var/lib/mysql にマウントしてました。

docker-compose.yml#L20

 - ./.data/db/mysql:/var/lib/mysql

ただこれだと、dockerのとある問題が発生してしまっていたので、 Dockerfileを作ってイメージをラップしないと行けなかったのです、、

どんな問題?

rails_db:             
  image: mariadb:10.0 
  volumes:            
    - ./mysql:/var/lib/mysql1
    - /tmp/mysql:/var/lib/mysql2

例えば、ローカルのカレントディレクトリ内や、/tmp以下のディレクトリをマウントした場合、Dockerコンテナ無いでは、

$ docker-compose run --rm rails_db ls -lda /var/lib/mysql1
drwxr-xr-x 2 root root 68 Sep  8 01:44 /var/lib/mysql1

$ docker-compose run --rm rails_db ls -lda /var/lib/mysql2
drwxr-xr-x 2 root root 68 Sep  8 01:44 /var/lib/mysql2

root:root としてマウントされちゃっています。 mysql って mysql ってユーザ名で動くので、パーミッションエラーが発生してしまうんですよね。悲しいことに なので、Dockerfile 側でmysqlユーザのuidを変更するなどして対応をしていました。

けど

やっぱ開発環境の為に、本番とかとは違う事

  • uidを変えたり
  • my.cnfでuserをrootにしたりとか

はやっぱ違うなと、それにもっとシンプルにしたいしという事で

rails_db:             
  image: mariadb:10.0 
  volumes:            
    - mysql-data:/var/lib/mysql

volumes:         
  mysql-data:    
    driver: local

こんな感じの方法で、永続化する事にしました。

$ docker-compose run --rm rails_db ls -lda /var/lib/mysql drwxr-xr-x 2 mysql mysql 4096 Sep 8 01:40 /var/lib/mysql `

ローカルマウントではないので、 mysql:mysql になります。

けど

Docker For Macは、20Gという制限があるので ※いつかは解消されるかな

永続化は出来たけど、ある一定以上のデータが入っちゃうと、、あれ なのである意味今は、マウントしちゃったほうがいいのかもしれないですけど、、というジレンマを抱えています。