Baby step - 思考と実験の足跡

日常のちょっとした、気になって試したこと集です。

Dockerを使ってRoR + mysql8.0の環境を構築する

目指す環境

Ruby 2.6.3
Rails 5.2.3
MySQL: 8.0.16

Dockerfile & docker-compose.ymlを作成

mysql5.7ですが、以下のサイトが非常に丁寧に説明してくださっております。 こちらを参考に、バージョン部分だけ書き換える。

Dockerfile

FROM ruby:2.6.3

ENV LANG C.UTF-8

RUN apt-get update -qq && \
  apt-get install -y build-essential \
  libpq-dev \
  nodejs \
  && rm -rf /var/lib/apt/lists/*

RUN mkdir /app_name
ENV APP_ROOT /app_name
WORKDIR $APP_ROOT

ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD ./src/ $APP_ROOT

docker-compose.yml

version: '3'
services:
  db:
    image: mysql:8.0.16
    volumes:
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_USER: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/app_name
    ports:
      - "3000:3000"
    links:
      - db

手順【9】でDBを作成しようとするも、以下のようなエラーが起きる

$ docker-compose exec web rake db:create
Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

ググってみるとMySQL8.0.4からデフォルトの認証方法が変わったらしい。

caching_sha2_passwordで検索すると見つかる

docker mysql8などで検索し見つけた記事を元にdocker-compose.ymlを修正

docker-compose.yml

version: '3'
services:
  db:
    image: mysql:8.0.16
    command: mysqld --default-authentication-plugin=mysql_native_password // 追加
    restart: always // 追加
    volumes:
      - ./src/db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_ROOT: root
    ports:
      - "3306:3306"

  web:
(中略)

今度こそ!

$ docker-compose exec web rake db:create
Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

なぜだ・・・

$ docker-compose run web rake db:create
Can't connect to MySQL server on 'db' (111 "Connection refused")
Couldn't create 'app_name_development' database. Please check your configuration.

プロジェクトを作成する前にdocker-compose.ymlへの追記が必要だった

ハマった挙げ句プロジェクトを消して、初めからやり直したらうまく行った。

断念してMySQL5.7か8.0.3を入れようか、とも考えてかけたとこだったので、うまく行ってよかった。