タイトル通りですが、Rails×Dockerを使って
docker-compose run web rails new . --force --no-deps --database=mysql
を実行した際に
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3306:
bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
が起きてつまづいてしまったので備忘録としてつけておきます。
versionに関しては
ruby: 2.7.5
docker:20.10.12
解決策
deeplで翻訳してみる。
デーモンからのエラー応答。listen tcp 0.0.0.0:3306:
bind: 通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)は1回のみ使用可能です。
既にポートが使われている感じなので変更してみる。
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: root
ports:
- - "3306:3306"
+ - "3307:3306"
volumes:
- ./tmp/db:/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:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
docker-compose.ymlのports部分の左側3306を3307に変更すればいけました。
ちなみに右側はコンテナをを表しており、コンテナ間の通信は3306が使われているらしいので変更はしない方がいいかも。
もしかしたら起動している際にも他のコンテナ間でポートの干渉するのかな
今はDockerを動かしている個数が少ないのでいいけど、もし干渉するならいちいち変更するのはめんどくさい感じがする。
結果
Done in 96.00s.
Webpacker successfully installed 🎉 🍰
無事行けて安心した。
ちなみに
余談ですがポートの干渉していた番号3306を調べてみると
"mysql.exe"でした。
このプロセスを削除するだけでも大丈夫な気がします。