20210305のMySQLに関する記事は6件です。

久しぶりにLaravel触ろうとしてすっかり忘れてた [Mac]

久しぶりにLaravel触ろうとしてすっかり忘れてたので入力コマンドを一覧にしてみた

※諸事情によりLaravel6系でやります。
Laravelのサポートについてはこちらの方が詳しく説明されています。

・構築環境
os: mac
エディタ: VSCode
シェル: bash

目次

  • composerが入っているかの確認
  • composerでlaravelインストール
  • バージョンを指定してプロジェクトを作成
  • laravelの起動を確認
  • MySQLの設定
  • SQLiteの場合
  • laravel日本語化

composerが入っているかの確認

composer
composer -v

開発環境の構築が必要な場合

Homebrewインストール

Homebrew~composer
# Homebrewインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# composerインストールと確認
brew install composer
composer

composerでlaravelインストール

composer-laravel
composer global require "laravel/installer"

バージョンを指定してプロジェクトを作成

composer-laravel
composer create-project laravel/laravel "プロジェクト名" 6.* --prefer-dist

laravelの起動を確認

※ポートは任意。なくても良い

laravel
cd "プロジェクト名"
php artisan serve --port=8080

http://127.0.0.1:8080にアクセス

MySQLの設定

MySQL
mysql.server start
mysql -u root -p
# パスを聞かれるがそのまま[enter]
MySQLデータベース作成、パスワード設定
create database 'データベース名';
show databases;
use 'データベース名';
# MySQLのバージョンによりどちらか
---
update mysql.user set password=password('パスワード') where user='root';
set password for 'root'@'localhost' = 'パスワード';
---
flush privileges;
exit;
MySQL再起動
mysql.server stop
mysql.server start

.envファイル変更

.env修正
DB_CONNECTION=mysql
DB_HOST=localhost //修正
DB_PORT=3306
DB_DATABASE='データベース名' //修正
DB_USERNAME=root
DB_PASSWORD='パスワード' //修正

*マイグレーション時にエラーが出る場合

エラー内容
Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = 'データベース名' and table_name = migrations and table_type = 'BASE TABLE')

データベース接続エラー(権限なし)
MySQL8系の場合、パスワード検証プラグインが「caching_sha2_password」で、PHPのデータベース接続用のPDOドライバが未対応みたいなので「mysql_native_password」に変更
参考

1 データベースユーザ作成

念の為、制作用ユーザを作るところから

ユーザを作成しユーザ権限を与える
# ユーザー作成
mysql> CREATE USER 'ユーザ名'@'localhost' IDENTIFIED BY 'root’;
# ユーザー権限付与
mysql> GRANT ALL PRIVILEGES ON <データベース名>.* TO 'ユーザ名'@'localhost';

2 権限の確認

ユーザを作成しユーザ権限を与える
mysql> show grants for 'ユーザ名'@'localhost';
+-------------------------------------------------------------+
| Grants for `ユーザ名`@localhost                                    |
+-------------------------------------------------------------+                    |
| GRANT ALL PRIVILEGES ON `<データベース名>`.* TO `ユーザ名`@`localhost` |
+-------------------------------------------------------------+

3 パスワードの検証プラグインの確認

パスワード検証プラグイン表示
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| `ユーザ名`         | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

4 パスワードの検証プラグインを変更

パスワード検証プラグイン変更
mysql> ALTER USER 'ユーザ名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';

5 ユーザパスワードの検証プラグインの変更結果を確認

パスワード検証プラグイン表示
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| `ユーザ名`         | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

6 権限の反映

権限の反映
mysql> flush privileges;

7 .envファイル変更

.env修正
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE='データベース名' //修正
DB_USERNAME='ユーザ名' //修正
DB_PASSWORD='パスワード' //修正

完了

SQLiteの場合

.env修正
DB_CONNECTION=sqlite //変更
// DB_DATABASE='データベース名' //コメントアウト
databaseディレクトリにファイル作成
cd "プロジェクト名"/database
touch database/database.sqlite

laravel日本語化

config/app.phpの修正

app.phpの修正
'timezone' => 'Asia/Tokyo',// タイムゾーン
'locale' => 'ja',          // 第一言語を日本語(ローカライゼーション)
'fallback_locale' => 'en', // 該当言語が見つからない場合の言語
'faker_locale' => 'ja_JP',

ここまでで、laravel初期設定は完了です。

参考

https://qiita.com/park-jh/items/78efe8c3c93cf533aafa
https://qiita.com/S-Masakatsu/items/b231a8a02737aff6a808

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【MySQL】NULLとDEFAULTの設定

NULLの許可

テーブル作成時に何も指定しなければ、NULLは許容されている。

NULLを許容しない場合はNOT NULLを指定する。

    CREATE TABLE cats
      (
        name VARCHAR(100) NOT NULL,
        age INT NOT NULL
      );

DEFAULT値の設定

INSERT時に値を入れなかった場合に、デフォルトで入る値を設定できる。
DEFAULTキーワードで指定する。

    CREATE TABLE cats
      (
        name VARCHAR(20) DEFAULT 'no name provided',
        age INT DEFAULT 99
      );
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLがローカルで起動できない

現象

ターミナルからMySQLのサーバーが起動できない。

エラーコード

$mysql.server start
...
dyld: Library not loaded: /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib
  Referenced from: /usr/local/Cellar/mysql/8.0.23_1/bin/my_print_defaults
  Reason: image not found
...
ERROR! The server quit without updating PID file (/usr/local/var/mysql/{パソコン名}.local.pid).

エラーの原因はいくつかに分かれているので、それぞれ対応します。
手順1:OpenSSLが悪さをしている。
手順2:{パソコン名}.local.pidファイルが存在していない。

対応した方法

手順1:OpenSSLが悪さをしている

HomebrewでOpenSSLを再インストールしてみました。

$ brew reinstall openssl
Error: /usr/local/opt/openssl@1.1 is not a valid keg

なぜかエラーで弾かれます。
is not a valid keg=インストール先のパスが有効でないと言われているので、brew上のopensslを確認してみます。

$ brew list openssl
Error: No such keg: /usr/local/Cellar/openssl@1.1

リストに出てこないので、そもそもbrew経由でインストールされたフォルダではないようです。
そのため、ターミナルで/usr/local/opt/に移動してから、openssl@1.1ディレクトリを削除します。
削除後、再度インストールしてみました。

$ brew install openssl
...
For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

==> Analytics
install: 866,703 (30 days), 2,419,116 (90 days), 8,609,687 (365 days)
install-on-request: 131,320 (30 days), 381,540 (90 days), 1,255,364 (365 days)
build-error: 0 (30 days)

無事OpenSSLがインストールできました。
次にMacOS上でOpenSSLが機能しているか確認してみます。

$ openssl version
LibreSSL *.*.*

MacOS上のSSLにopenSSLではなくLibreSSLが使われているようです、先ほどインストールしたopenSSLに変更するため、bash_profileでSSLのパスを書き換えます。

$ echo 'export PATH="/usr/local/opt/openssl/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile

これでopenSSLの対応は完了しました。

手順2:{パソコン名}.local.pidファイルが存在していない

該当するpidファイルが存在しているか確認します。

$ cd /usr/local/var/mysql
aaa bbb ccc ddd

存在していない場合は自分で作ってしまいます。

$ touch /usr/local/var/mysql/{パソコン名}.local.pid

実行して確認

最後に実行して確認してみます。

$ mysql.server start
Starting MySQL
 SUCCESS! 

これでようやくMySQLが実行できるようになりました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerによる開発環境を立ち上げるまで【Rails + Nginx + Unicorn + MySQL】

Dockerを導入し、コンテナを立ち上げVSCodeで開発を行うところまで環境構築ができました。
備忘として導入した流れを簡単にまとめておきたいと思います。

インストール

Docker公式サイトからDocker Desctopをダウンロード。
以下の記事を参考にしてインストールしました。

参考記事:Dockerインストール手順<macOS向け>

フォルダ構成

Dockerfileは記事によって配置場所が異なりますが、個人的にはこの構成が一番綺麗にまとまってると思いました。
Dockerfileやdocker-compose.yml、それにNginxやUnicornの設定ファイルは自動生成されないので自分で作ります。

app
├ config
│ ├ database.yml
│ └ unicorn_development.conf.rb
├ docker
│ ├ web
│ │ └ Dockerfile
│ └ nginx
│   ├ Dockerfile
│   └ revorite.conf
└ docker-compose.yml

Docker関連ファイルの記述

以下記事を参考にさせていただきました。
参考記事:DockerでNginx+unicorn+rails+Mysqlの開発環境を作ってみた

docker/web/Dockerfile

FROM ruby:2.7.1
# dockerizeパッケージダウンロード用環境変数
ENV DOCKERIZE_VERSION v0.6.1

# パッケージの取得
RUN apt-get update && \
    apt-get install -y --no-install-recommends\
    nodejs  \
    vim \
    mariadb-client  \
    build-essential  \
    wget \
    && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN echo "alias cp='cp -i'" >> /root/.bashrc
RUN echo "alias mv='mv -i'" >> /root/.bashrc
RUN echo "alias rm='rm -i'" >> /root/.bashrc
RUN echo "alias la='ls -al'" >> /root/.bashrc
RUN echo "alias ll='ls -l'" >> /root/.bashrc

RUN gem install bundler
RUN bundle install

COPY . /app

docker/nginx/Dockerfile

FROM nginx:stable
# デフォルトのNginxの設定ファイルを削除し、作成しておいた設定ファイルをコピー
RUN rm -f /etc/nginx/conf.d/*
COPY ./docker/nginx/revorite.conf /etc/nginx/conf.d/revorite.conf

RUN echo "alias cp='cp -i'" >> /root/.bashrc
RUN echo "alias mv='mv -i'" >> /root/.bashrc
RUN echo "alias rm='rm -i'" >> /root/.bashrc
RUN echo "alias la='ls -al'" >> /root/.bashrc
RUN echo "alias ll='ls -l'" >> /root/.bashrc

# -c以降の設定ファイルを指定して起動 daemon offでフォアグラウンドで起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

docker/nginx/revorite.conf (Nginx設定ファイル)

docker/nginx/revorite.conf
# log directory
error_log  /var/log/nginx.error.log;
access_log /var/log/nginx.access.log;
# max body size
client_max_body_size 2G;
upstream unicorn {
  # for UNIX domain socket setups
  server unix:/app/tmp/sockets/.unicorn.sock fail_timeout=0; 
}
server {
  listen 80;
  server_name localhost; 
  # nginx so increasing this is generally safe...
  keepalive_timeout 5;
  # path for static files
  root /app/public; 
  location @unicorn {
    # HTTP headers
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }
  location / {
    try_files $uri/index.html $uri.html $uri @unicorn;
    include /etc/nginx/mime.types;
  }
  location ~ ^/assets/(.*) {
    alias /app/public/assets/$1;
  }
  # Rails error pages
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /app/public; 
  }
}

docker-compose.yml

docker-compose.yml
version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    # dockerizeを使い、DBの起動を待ってからUnicornを起動する。
    command: dockerize -wait tcp://db:3306 -timeout 20s bundle exec unicorn -p 3000 -c /app/config/unicorn_development.conf.rb
    environment:
      TZ: Asia/Tokyo
    tty: true         # binding.pryを利用可能にするための2行
    stdin_open: true  # binding.pryを利用可能にするための2行
    depends_on:
      - db 
    ports:
      - "3000:3000"
    volumes:
      - .:/app:cached 
      # ソケット通信用ファイルをnginxコンテナと共有
      - tmp-data:/app/tmp/sockets
      # アセットファイルをnginxと共有
      - public-data:/app/public

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    ports: 
      - "4306:3306"
    environment:
      MYSQL_DATABASE: revorite_development
      MYSQL_ROOT_PASSWORD: password
    # dbのデータを永続化しておく
    volumes:
      - mysql-data:/var/lib/mysql

  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - 80:80
    restart: always #明示的にstopさせるまでリスタートする。(失敗するたび遅延あり)
    volumes:
      - tmp-data:/app/tmp/sockets
      - public-data:/app/public
    depends_on:
      - web 

volumes:
  public-data:
  tmp-data:
  mysql-data:

config/database.yml

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  host: db
  username: root
  password: password
  database: revorite_development

config/unicorn_development.conf.rb

config/unicorn_development.conf.rb
# set lets
$worker  = 2
$timeout = 30
$app_dir = "/app"
$listen  = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir
$pid     = File.expand_path 'tmp/pids/unicorn.pid', $app_dir
$std_log = File.expand_path 'log/unicorn.log', $app_dir
# set config
worker_processes  $worker
working_directory $app_dir
stderr_path $std_log
stdout_path $std_log
timeout $timeout
listen  $listen
pid $pid
# loading booster
preload_app true
# before starting processes
before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      Process.kill "QUIT", File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end
# after finishing processes
after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

コンテナ作成・起動

$ docker-compose build  # イメージの作成
$ docker-compose up -d  # コンテナの作成・起動

詰まった点

他の記事ではあまり語られておらず、自分が詰まった点をいくつか。

Unicornの起動で失敗する

関連ファイルを作り終え、いざdocker-compose builddocker-compose up -dを叩く。
そしてdocker psを叩くと・・・

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                               NAMES
11e605b70c51   revorite_nginx   "/docker-entrypoint.…"   21 minutes ago   Up 21 minutes   0.0.0.0:80->80/tcp                  revorite_nginx_1
313d53cbbc27   mysql:5.7        "docker-entrypoint.s…"   21 minutes ago   Up 21 minutes   33060/tcp, 0.0.0.0:4306->3306/tcp   revorite_db_1

あれ?アプリサーバは???
で、docker-compose logsでログを見てみると

web_1    | 2021/03/04 11:01:27 Command exited with error: exit status 1

exit status 1とは一体・・・
exitしたということは一度起動して即落ちた、と読めるので、落ちたコンテナに入ってログも見てみたのですがそれらしいログは出ていない。
(落ちたコンテナに入る方法はこちらを参考にしました)

最終的に、database.ymlhost: dbの記述が漏れているためだということが判明。一文追加し、無事起動しました。
こんな単純なミスなのですが一日使ってしまったので、Dockerfileとdocker-composeだけを書いて満足しないように注意です。

コンテナ内でGitが使えない

GitをインストールしSSH認証もできるようにしたのですが、どうしてもgit pushだけが弾かれてしまうんですよね。(commitまではできる)

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

仕方ないのでgit関連の操作はホスト側で実行しています(ホスト側でコンテナ内のソースコードに対しマウントしている)。git操作もコンテナ内で完結できたらベストだったのですが。
 

コンテナ内で開発を行う(VSCode: Remote Development)

コンテナ内で開発を行うには、VSCodeでコンテナ内のソースを参照・開発できるRemote Developmentという拡張機能を使います。
参考記事:VS Code Remote Development で Docker 開発環境を利用する

前述の起動コマンドで起動できていれば、参考記事の通りに起動するだけで特に問題は起きないはず。

その他補足

docker関連のコマンドは長いので、~/.bashrcにエイリアスを設定すると便利。
またエラーが起きる度にコンテナやイメージの削除コマンドを打つのが大変のため、こちらも設定しておくと快適です。

# 例
alias dco='docker-compose'
alias docker-purge='docker stop $(docker ps -q) && docker rm $(docker ps -a -q) && docker rmi $(docker images -q -a) -f'

改善点や誤りなどありましたらコメントで指摘いただけると幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RubyでMySQLに接続し、大量のINSERT文を作成する

大量のINSER文を発行する必要があったので、スクリプトで書いてみた。
RubyとMySQLはインストールしてある前提

ディレクトリとファイルの作成

terminal
$ mkdir ruby_scripts && cd $_
$ touch test.rb
$ chmod 755 test.rb

test.rbの中身

test.rb
#!/usr/bin/ruby

require 'mysql2'

connection = Mysql2::Client.new(host: "localhost", username: "root", password: 'pass', :encoding => 'utf8', database: 'database_name')
// 自分の環境に合わせる

selectSql = "SELECT id FROM table WHERE flag = 1;"
//こんな単純なSELECT文ならそもそもスクリプトを書く必要はないと思うが...

res = connection.query(selectSql)

res.each do |r|
  code = r["id"]
  //実行結果のINSERT文内の変数rにハッシュがそのまま入ってしまうので、値だけを取り出して新しい変数codeに代入

  puts "INSERT INTO table2 (id, code) VALUES (2, '#{code}');"
end

Gemfileの作成

$ bundle init

Gemfileの一番下に記述

gem "mysql2"

bundle install

$ bundle install

実行

bundle exec ruby test.rb > hoge.sql

上を実行して作られるhoge.sqlをsourceコマンドで実行すればデータをINSERTできます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Docker】Ruby2.6.5とRails6.0.0とmysql DockerComposeで環境構築

はじめに

Ruby2.6.5とRails6.0.0とmysqlでDockerComposeで環境構築をしたので記録として記事を書きます。
もし誰かのお役に立てたら幸いです。

Docker環境でアプリケーション開発する手順

1、RailsのDockerfileを作成してDockerをbuild
2、DockerCompose.ymlを作成しコンテナを作る
3、Rails のセットアップ
4、データベースを作成する

開発環境

Docker version 20.10.0
docker-compose version 1.27.4

1、RailsのDockerfile作成

新しいデレクトリを作成します。
今回はデレクトリ名をexamとしてます。

ターミナル
mkdir [新規デレクトリ名]
cd [新規デレクトリ名]

Dockerfile

新規で作ったデレクトリに「Dockerfile」をいう名前でDockerファイルを作成します。
VSコードをお使いの方はcode Dockerfileでターミナルから直接ファイルの作成&移動をしてくれます。
もちろんディレクトリを呼び込んでファイルを作成しても大丈夫です。

exam/Dockerfile
FROM ruby:2.6.5
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev \
    nodejs\
    yarn \
    vim 

WORKDIR /新規デレクトリ名
COPY Gemfile Gemfile.lock /新規デレクトリ名/
RUN bundle install

Gemファイルを作成する

ターミナル
touch Gemfile Gemfile.lock

Gemfileにファイルを持ってくるソースとrailsのバージョンを記述します。

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>6'

Dockerを建てます。

ターミナル
docker build .
.
.
.
Installing rails 6.1.2.1
Bundle complete! 1 Gemfile dependency, 42 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Removing intermediate container 06448279a57c
 ---> c21a3ec7e3a4
Successfully built c21a3ec7e3a4

#イメージが出来てるか調べる事も出来ます。
docker images 

#もし使っていないイメージがあれば下記のコマンドで削除できます。
docker rmi [IMAGE ID]

2、DockerCompose.ymlを作成しコンテナを作る

dockerc-compose.ymlファイルを作成し記述する

ターミナル
code docker-compose.yml

これで新しいdocker-compose.ymlが作成されます。

docker-compose.yml
version: '3'

services:
  web:
    build: .
    ports:
      - 3000:3000
    volumes:
      - '.:/[作成したディレクトリ名]'
    tty: true
    stdin_open: true

dockerc-ompose.ymlの確認をして実行します

#確認します
cat docker-compose.yml

#実行します
docker-compose up -d


#コンテナが動いてる事を確認します。
docker ps
docker-compose ps

#コンテナの中に入ります。
docker-compose exec web bash

3、Rails のセットアップ

Railsの環境でコンテナができのでその中でrails newをしてセットアップして行きます。

#新しいrailsを作ります
rails new . --force --database=mysql --skip-bundle

#一度コンテナから抜けます
exit

#今のコンテナとイメージを削除します
docker-compose down

#Downになってるか確認します
docker ps

#新しいイメージでコンテナを建てます
docker-compose up --build -d

#確認します
docker-compose ps

#コンテナに入ります
docker-compose exec web bash

#Railsを起動します
rails s -b 0.0.0.0 #現段階ではエラーが出ます

現段階ではデータベースの記述を Dockerfileに記述していないので、mysql2のエラーが出ると思います。
下記の対応を試して下さい。

【Docker】エラー Could not find gem 'mysql2 (~> 0.5)' in any of the gem sources listed in your Gemfile
https://qiita.com/AKI3/items/8009b5218be0ad67b6b7

エラーが解決したらrails s -b 0.0.0.0でサーバーが立ち上がります。
実際にlocalhost:3000でアクセスします。
しかしこのままではデータベースが無いのでエラー画面が表示されます。
スクリーンショット 2021-02-15 17.02.13.png

4、データベースを作成する。

ローカルであればrails db:createをするとデータベースを作れるのですが、コンテナ内では現状の設定では作れません。
Dockerではサービス(環境)ごとにコンテナを作る事が推奨されております。
今回であればRubyとmysqlのコンテナを別々に作り、それぞれのコンテナどうしを接続する必要があります。
その為、detabase.ymlの設定ファイルを編集して正しい指定をし、docker-compose.ymlの設定ファイルの編集します。

先ずdetabase.ymlを編集します。

config/detabase.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db

development:
  <<: *default
  database: 新規デレクトリ名_development
  username: root
  password:

省略

次にdocker-compose.ymlを編集します。

docker-compose.yml
version: '3'

volumes:
  db-data:

services:
  web:
    build: .
    ports:
      - 3000:3000
    volumes:
      - '.:/新規デレクトリ名'
    environment:
      - 'MYSQL_ROOT_PASSWORD=1'
    tty: true
    stdin_open: true
    depends_on:
      - db
    links:
      - db

  db:
    image: mysql:8
    volumes:
      - 'db-data:/var/lib/mysql'
    # このenvironmentはテスト環境でのみ使用可能
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 1

    # command: bundle exec rails s -p 3000 -b '0.0.0.0' #こちらはお好みで

docker-compose.ymlを編集したので新しくコンテナを作ります。
今回はweb(Raisl)とdb(mysql)2つのコンテナを作る事になります。

#再びコンテナを建てます
docker-compose up -d

#upになってるか確認します
docker-compose ps

#コンテナに入ります
docker-compose exec web bash

#データベースを作成します
rails db:create #現段階ではエラーが出ます

Rails側のコンテナ内で作業を進めていきます。
先程作ったRails側のコンテナとmysql側のコンテナがしっかり繋がっていればrails db:createのコマンドは通りますが、現段階では下記のエラーが発生します。

Mysql2::Error::ConnectionError: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

これはwebコンテナが mysql 8.0 のcaching_sha2_passwordが認証方式に対応していないためだそうです。

詳しくは、こちらの記事で解決できます。
https://blog.toshimaru.net/rails-on-docker-compose/

コマンドだけこちらに記載します。

ターミナル
 #データベース側のコンテナに入る
docker-compose exec db bash

 #mysqlを操作する
mysql -u root

 #ユーザー一覧とその認証方式が閲覧
select User,Host,plugin from mysql.user;

 #root@% のユーザー設定を変更
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '';

 #再度ユーザー一覧とその認証方式が閲覧
select User,Host,plugin from mysql.user;

エラーが解決できたら最後サーバーを立ち上げます。

ターミナル
rails s -b 0.0.0.0

=> Booting Puma
=> Rails 6.1.2.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.2.1 (ruby 2.6.5-p114) ("Fettisdagsbulle")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 29
* Listening on http://0.0.0.0:3000
Use Ctrl-C to stop
.
.
.
省略

出来ました!
localhost3000にアクセスすると-Yay! You’re on Rails!-の画面が表示されます。
スクリーンショット 2021-02-17 17.16.29.png

最後に

手探りの対処療法でサーバー起動まで達成しましので、これからも継続学習が必要です。
なんとか環境構築まで至りましたが、Dockerについて完全に理解できておりません、万が一情報が間違っている場合ご指摘していただけると幸いです。

エンジニア初学者ですが、同じ様に悩んでる方々の助けになればと思い記事を投稿しております。
万が一情報が間違っている場合ご指摘していただけると幸いです。

参考

今回Udemyの教材とやっすんのエンジニア大学を主に参考にさせていただきました。
https://www.udemy.com/course/aidocker/
https://github.com/yassun-youtube/docker-compose-sample/blob/master/docker-compose.yml

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む