質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

Q&A

解決済

1回答

3788閲覧

【Docker】コンテナ上にDBを作成する際に「Ports are not available 〜 address already in use」が発生する

black_pasta1001

総合スコア19

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

0グッド

0クリップ

投稿2022/01/06 12:51

既存のrailsアプリにdocker環境を導入していたところ、[docker-compose run web bundle exec rake db:create]実行時にタイトルのエラーが発生しました。ネットで検索した方法で解決できなかったのでどなたか助けて頂きたく存じます。

#発生経緯

①下記3ファイルを作成

Dockerfile

1FROM ruby:3.0.2 2RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ 3 && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 4RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn 5 6 7WORKDIR /my_app 8COPY Gemfile /my_app/Gemfile 9COPY Gemfile.lock /my_app/Gemfile.lock 10RUN gem install bundler 11RUN bundle install 12COPY . /my_app 13 14RUN yarn install --check-files 15RUN bundle exec rails webpacker:compile 16 17COPY entrypoint.sh /usr/bin/ 18RUN chmod +x /usr/bin/entrypoint.sh 19ENTRYPOINT ["entrypoint.sh"] 20EXPOSE 3000 21 22CMD ["rails", "server", "-b", "0.0.0.0"]
#docker-compose.yml version: "3" services: db: image: mysql:8.0.26 environment: MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/my_app ports: - "3000:3000" depends_on: - db stdin_open: true tty: true volumes: mysql-data: driver: local
#entrypoint.sh #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /アプリ名/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"

②docker imageをビルド

$ docker-compose build [+] Building 427.9s (18/18) FINISHED

③Dockerコンテナ上にデータベースを作成
タイトルのエラー発生

$ docker-compose run web bundle exec rake db:create Starting my_app_db_1 ... error ERROR: for my_app_db_1 Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use ERROR: for db Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: address already in use ERROR: Encountered errors while bringing up the project.

#試したこと

$ sudo lsof -i -P | grep "LISTEN" mysqld 40347 _mysql 19u IPv4 0xb4ab58fb49e4ab55 0t0 TCP localhost:33060 (LISTEN) mysqld 40347 _mysql 21u IPv4 0xb4ab58fb4a896b55 0t0 TCP localhost:3306 (LISTEN) $ sudo kill -9 40347 $ sudo lsof -i -P | grep "LISTEN" #停止できた確認すると違うIDでmysqldが復活していました。 mysqld 40432 _mysql 19u IPv4 0xb4ab58fb463fcdcd 0t0 TCP localhost:33060 (LISTEN) mysqld 40432 _mysql 21u IPv4 0xb4ab58fb463f9b55 0t0 TCP localhost:3306 (LISTEN)
#mysqlサーバーを停止しようとするとこれはこれでエラーが発生してしまいます。 $ sudo mysql.server stop ERROR! MySQL server PID file could not be found!
#docker-compose.yml db: image: mysql:8.0.26 environment: MYSQL_ROOT_PASSWORD: password ports: - "3307:3306" #左の数字を変更して試してみましたがダメでした。 volumes: - mysql-data:/var/lib/mysql

#database.yml

default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password socket: /tmp/mysql.sock development: adapter: mysql2 encoding: utf8 reconnect: false database: my_app_development pool: 5 username: username password: password host: localhost test: adapter: mysql2 encoding: utf8 reconnect: false database: my_app_test pool: 5 username: username password: password host: localhost production: <<: *default database: <%= Rails.application.credentials.db[:database] %> username: <%= Rails.application.credentials.db[:username] %> password: <%= Rails.application.credentials.db[:password] %> socket: <%= Rails.application.credentials.db[:socket] %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

リアルなOS上で動いているデーモン(多分)MySQL がそのportを使っているからです。
リアルな方を止めて良いなら止めるし、だめなら Dockerの方のportを変えましょう。
PID file could not be found! が出るのは、なんらかのことが削除してしまったか、
停止scriptに書かれているfileとmusqlの起動scriptが指定しているfileが違っているからです。
ps で調べた pid でkillすれば止まります

投稿2022/01/06 12:58

winterboum

総合スコア23567

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

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

black_pasta1001

2022/01/06 13:52

回答いただきありがとうございます。 当方初学者につき理解が及ばず、2点追加で質問させてください。 ①psでリアルの方を調べるにはどのようなコマンドを実行したら良いでのしょうか? ②リアルな方を止めた場合、本番環境(EC2)で起動しているmysqlも止まってしまうのでしょうか?
winterboum

2022/01/06 22:41

1 ps -eaf | grep mysqld で見てください。 OSによって若干 -eaf が変わるかも 2 本番は影響受けません なお、リアルなmuysqld をリアルななんかのプロセスが使ってると、止まってくれないときもあるかも
black_pasta1001

2022/01/07 00:05 編集

ps -eaf| grep mysqldで表示されたpidをkillし、再度db:createを実行したところ、 Creating my_app_web_run ... done Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2) Couldn't create 'my_app_development' database. Please check your configuration. というエラーが発生しましたので mysqlを再起動すると大元の結局ポートが使用済みというエラーに遭遇します。 Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2) のエラーを回避しつつ、ポート使用済み問題を解決するにはdockerのポート番号を変更するしかないでしょうか?
winterboum

2022/01/07 00:11

それが一つ、もう一つ socket '/run/mysqld/mysqld.sock' とつながらない と言ってますから、その修正も必要ですね。 dockerのsocket file の定義と、Rails の dtabase.yml のsocket定義を一致させてください。
black_pasta1001

2022/01/07 09:12

別のエラーが発生してしまいましたがsocketは繋がったようです。元の問題は解決されたようなのでこちらの質問はクローズさせて頂きます。ご丁寧にご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問