#この記事でできること
・Dockerfileの記述をちょっと変えることで、データベースを操作できるようにする。
##環境
・Ruby 2.6.6, Rails 6.0.3.2
・Docker,Docker-compose(開発環境)
##抱えた問題
テーブルを削除できたと思って、再度同じテーブルを作成しようとしたら「すでにそのテーブルはありまっせ」エラーが出てきた。
% docker-compose run --rm web rails db:migrate
Mysql2::Error: Table 'news' already exists
##やったこと①
https://bokunonikki.net/post/2018/0214_rails_mysql_error/
参考URLの通りrails db
を実行してデータベースを操作しようとしたけど、またまたエラーが出た。。。
% docker-compose run --rm web rails db
Couldn't find database client: mysql, mysql5. Check your $PATH and try again.
webサーバー側のDockerfileにmysql-client
を入れていないからエラーになっていたようです。
参考URLを真似て早速以下のDockerfileでbuildをしてみたが、buildに失敗する。。。
なんでや?????
FROM ruby:2.6
# install package to docker container
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev \
&& apt-get install apt-transport-https \
&& curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
&& apt-get update && apt-get install -y yarn \
&& curl -sL https://deb.nodesource.com/setup_10.x | bash - \
&& apt-get install -y nodejs mysql-client \ #mysql-clientを追記
&& mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
E: Package 'mysql-client' has no installation candidate
###エラー原因
「パッケージ:'mysql-client' のインストール候補がありません」エラーが出てるみたい。
mysql-clientはmariadb-clientに統合されていて、mysql-clientは使えないっぽい!!
ということで、Dockerfile内のmysql-clientを、mariadb-clientに変更して再度buildしまっせ!!
FROM ruby:2.6
#~~~~ 省略 ~~~~
&& apt-get install -y nodejs mariadb-client \ #mariadb-clientに変更
#~~~~ 省略 ~~~~
% docker-compose build
なんやかんや
Successfully built
##これでmyaqlにログインできる
% docker-compose run --rm web rails db
#パスワードが求められるからパスワードを入力
SHOW TABLES;
でテーブル一覧をチェック
該当のテーブルがあることを確認。
MySQL [myapp_development]> SHOW TABLES;
+------------------------------+
| Tables_in_myapp_development |
+------------------------------+
| news |
+------------------------------+
18 rows in set (0.009 sec)
drop table テーブル名;
でテーブル一を削除
MySQL [myapp_development]> drop table news;
Query OK, 0 rows affected (0.311 sec)
##まとめ
テーブルを削除するだけでもだいぶ時間がかかりましたな。。。
Dockerfileをいじるだけでできることが増えるのはなんか楽しい。