🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

2487閲覧

docker-composeでDB(Mysql)を開発用・テスト用で使い分ける方法について

Harluz

総合スコア19

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/12/31 09:16

railsでポートフォリオを作成中です。
表題のとおりdokker-composeを使用して開発しております。
現在まで、develpment環境のみのDBを作成しておりました。
しかし、所用でdevelopment,testの環境によってDBを使い分けたいです。
下記のqiitaの記事を参考にtest_dbコンテナを追加してみました。
Rails x Docker環境にテストDBを構築する

【Docker】Rspecテスト用データベースの仮想環境構築

dockercomposeyml

1version: '3' 2services: 3 app: &app_base 4 build: 5 context: . 6 environment: 7 # RAILS_ENV: development 8 MYSQL_ROOT_PASSWORD: db_root_password 9 MYSQL_USER: app 10 MYSQL_PASSWORD: password 11 # MYSQL_DATABASE: 12 # - my_app_development 13 # - my_app_test 14 # DATABASE_HOST: db 15 stdin_open: true 16 tty: true 17 command: bundle exec puma -C config/puma.rb 18 volumes: 19 - .:/my_app 20 - public-data:/my_app/public 21 - tmp-data:/my_app/tmp 22 - log-data:/my_app/log 23 depends_on: 24 - db 25 - test_db 26 db: 27 image: mysql:5.7 28 environment: 29 MYSQL_ROOT_PASSWORD: db_root_password 30 MYSQL_USER: app 31 MYSQL_PASSWORD: password 32 MYSQL_DATABASE: my_app_development 33 DATABASE_HOST: db 34 volumes: 35 - db-data:/var/lib/mysql 36 ports: 37 - "3316:3306" 38(追加)-------------------------------------------- 39 test_db: 40 image: mysql:5.7 41 environment: 42 MYSQL_ROOT_PASSWORD: db_root_password 43 MYSQL_USER: test_app 44 MYSQL_PASSWORD: password 45 MYSQL_DATABASE: my_app_test 46 DATABASE_HOST: test_db 47 volumes: 48 - db-data:/var/lib/mysql 49 ports: 50 - "3317:3306" 51-------------------------------------------- 52 web: 53 build: 54 context: containers/nginx 55 volumes: 56 - public-data:/my_app/public 57 - tmp-data:/my_app/tmp 58 ports: 59 - "3000:80" 60 depends_on: 61 - app 62volumes: 63 public-data: 64 tmp-data: 65 log-data: 66 db-data:

databaseyml

1default: &default 2 adapter: mysql2 3 encoding: utf8 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 # username: <%= ENV.fetch('MYSQL_USER') { 'app' } %> 6 password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %> 7 # host: localhost ←ローカル環境で実行する場合 8 # host: db 9 port: 3306 10 11development: 12 <<: *default 13 username: <%= ENV.fetch('MYSQL_USER') { 'app' } %> 14 database: my_app_development 15 host: db 16 17test: 18 <<: *default 19 username: <%= ENV.fetch('MYSQL_USER') { 'test_app' } %> 20 database: my_app_test 21 host: test_db 22 23# production: 24# <<: *default 25# database: my_app_production 26 27# https://qiita.com/nishina555/items/7142bc80ac0c678c3835 を参考に実装R2/12/31

上記コードに修正して
docker-compose down
docker-compose build
docker-compose up
を実行し、upの際に出力されるログでエラーが発生しておりました。
そのエラーが下記となります。

log

1[ERROR] InnoDB: Unable to lock ./ibdata1 error: 11 2[Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.

このエラーなどについて他のサイト等を参考にしてプロセスをkillしたりもしたのですが、そもそも複数のDBを立ち上げる場合、このエラーは避けられないのでは?という考えに至ったところでございます。しかし、最初に貼り付けqiitaの記事では環境別にDBを使い分けれているようでしたので、何が原因か教えていただければとてもたすかります。

他にデータが必要な場合、対応いたしますのでよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Harluz

2020/12/31 13:25

ご回答ありがとうございます。そうですね、楽しようとしたことを認めます。 gentaro様の他質問に対する回答を拝見させていただき、とても知識・経験のある方だと感じました。そのような方からご指摘を頂けてありがたく思います。とても図々しいお願いになるのですが、私は独学でプログラミングを勉強しております。基礎的な知識が欠如しており最低限の知識として何かおすすめの本などがございましたら、教えていただくことは可能でしょうか?とくにインフラ周りは全くわかりません。もしくはgentaro様自身がこれはためになったと思えるようなものでも構いません。 よろしくお願いします。
gentaro

2020/12/31 13:34

おそらくこのサイトを根本的に誤解してると思う。 メンターが欲しいなら有償でやってくれるサイトがあるんでそういうの使うべき。 https://menta.work/
Harluz

2020/12/31 13:42

ありがとうございます。
guest

回答1

0

自己解決

mysqlのデータベースについて
参考にしたサイトではuser_name及びpasswordをdevelopment・test環境のどちらでも同じ値を使用している。
それで実行すると、片方のDBは立ち上げに成功するが、もう片方は「そのパスワードはすでに使用されている」という旨のエラーメッセージが出力されたので、development・test環境で下記のように修正した。
development
user_name: app
password: password
database: my_app_development
host: db
test
user_name: test_app
password: password_test(例)
database: my_app_test
host: test_db

互いに干渉することのないよう環境毎に値を区分し、docker-compose.ymlをこれに合わせて修正し実行した結果、うまく立ち上げることができました。

投稿2021/01/01 13:04

Harluz

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問