👌

【Rails7.1】Docker環境でCouldn't find database client: mysql, mysql5.の対処法

2024/07/17に公開

個人開発をしていた際、rails dbconsoleを実行したところ、以下のエラーが出ました。

Couldn't find database client: mysql, mysql5. Check your $PATH and try again.

原因がわかったので解決方法を備忘録としてまとめます。

問題

環境構築後、Railsのマイグレーションで不整合が発生したため、調査のためにMySQLの中身を見ようとしていました。

しかし、rails dbconsoleを実行したところ、Couldn't find database client: mysql, mysql5. Check your $PATH and try again.とエラーが出てしまい、MySQLの中に入れない状況でした。

$ docker compose exec web bash
$ root@2cccb198027f:/sample-api# rails dbconsole
Couldn't find database client: mysql, mysql5. Check your $PATH and try again.

使っていたDockerfileとdocker-compose.yamlは次のとおりです。

Dockerfile

# syntax=docker/dockerfile:1
FROM ruby:3.2.2

WORKDIR /sample-api
COPY Gemfile /sample-api/Gemfile
COPY Gemfile.lock /sample-api/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yaml

services:
  db:
    image: mysql:8.0
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
  web:
    build: .
    volumes:
      - .:/sample-api
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  db-data:

解決方法

Dockerfileの中でmysql-clientをインストールしていないことが原因でした。

以下のようにDockerfileを修正します。

# syntax=docker/dockerfile:1
FROM ruby:3.2.2
# 下記の1行を追加
RUN apt-get update -qq && apt-get install -y default-mysql-client

WORKDIR /sample-api
COPY Gemfile /sample-api/Gemfile
COPY Gemfile.lock /sample-api/Gemfile.lock
RUN bundle install

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Configure the main process to run when running the image
CMD ["rails", "server", "-b", "0.0.0.0"]

mysql-clientではなくdefault-mysql-clientとしないとエラーが起きてしまうので要注意です。

修正が完了したらもう一度ビルドし、コンテナを立ち上げましょう。

$ docker compose build
$ docker compose up

コンテナの中に入り再度rails dbconsoleを実行してみると、、、

$ docker compose exec web bash
$ root@2cccb198027f:/sample-api# rails dbconsole
Enter password: 
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.35 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [sample_api_development]>

MySQLコンテナの中に入ることができました!!

おわりに

Dockerは日々の業務でも使っていますが、Dockerfileを自力で書くにはもっとしっかりDocker周りの勉強をした方が良さそうだと感じました。

参考文献

Discussion