DockerエラーIs the server running on host "localhost" (127.0.0.1) and acceptingTCP/IP connections on port 5432?の解決法 Dockerの各種削除コマンドも紹介

postgresを使用しています。

ローカルでdockerを立ち上げ、 docker-compose run web bin/rake db:createをしたところ次のエラー。

エラー文
could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?
Couldn't create 'portfolio_development' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
could not connect to server: Cannot assign requested address
Is the server running on host "localhost" (::1) and accepting
TCP/IP connections on port 5432?




訳すと
・hostである”ローカルホストに接続できないよ”
・port 5432のアクセスを許可してる？

したがってdocker-compose.ymlとconfig/database.ymlを見てみる。

docker-compose.ymlファイル↓

version: '3'
services:
db:
image: postgres
# 秘匿情報は環境変数を定義するファイルにまとめる。
env_file:
- ./.env
# envを読み込んだだけではcomposeの中でしか公開されないためenvironmentで宣言
environment:
# # こことdatabase.ymlのpasswordは揃える。
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
# ホスト:コンテナでポートフォアワーディング。
ports:
- ${HOST_OS_DATABASE_PORT}:5432
web:
build: .
command: bash -c "bin/rails db:create && bin/rails db:migrate && rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
# ここの右辺とDockerfileのWORKDIRを揃える(大文字小文字が違いました。)
- .:/Portfolio
# あまり変更のない部分をマウントしておくことで起動を早める。
- bundle-data:/Portfolio/vendor/bundle
- bundle:/Portfolio/.bundle
- public:/Portfolio/public
- tmp:/Portfolio/tmp
- log:/Portfolio/log
ports:
- ${HOST_OS_RAILS_PORT}:3000
depends_on:
- db
- chrome
chrome:
image: selenium/standalone-chrome:3.141.59-dubnium
ports:
- 4444:4444
volumes:
db-data:
bundle-data:
bundle:
public:
tmp:
log:




config/database.yml

default: &default
adapter: postgresql
encoding: unicode
# 自身のpostgresqlに登録してあるユーザ名にする。
username: <%= ENV.fetch('POSTGRES_USER') %>
password: <%= ENV.fetch('POSTGRES_PASSWORD') %> # docker-composeのPOSTGRES_PASSWORDと揃える。
pool: 5
host: <%= ENV.fetch('DATABASE_HOST') %> # docker-composeのサービス名にする。
port: <%= ENV.fetch('DATABASE_PORT') { 5432 } %>

development:
<<: *default
database: portfolio_development

test:
<<: *default
database: portfolio_test

production:
<<: *default
database: portfolio




後、.envにそれぞれ記載しているためそちらも確認。

見つけた。

config/database.ymlの中のDATABASE_HOSTの値はdocker-compose.ymlで記載されているサービス名にしなければ行けなかった。

.envではlocalhostにしていたことが原因です。

dbにしなければいけないので、.envにdbと記載。
そしてdocvkerが過去のvolumeを参照しないように全て削除。

↓順番にコマンドを入力。

$ docker system prune #停止コンテナ、タグ無しイメージ、未使用ボリューム、未使用ネットワーク一括削除
$ docker container prune #停止コンテナ一括削除
$ docker rm -f `docker ps -a -q` #全コンテナ一括削除
$ docker image prune #未使用イメージ一括削除
$ docker rmi `docker images -f "dangling=true" -q` #タグ無しイメージ一括削除
$ docker volume prune #未使用ボリューム一括削除
$ docker network prune #未使用ネットワーク一括削除




これでtestの部分のhostがdbになります。

そしてdockerを立ち上げる。

$ docker-compose build
$ docker-compose up -d #途中からDockerを立ち上げる場合はここまででよい。
$ docker-compose run web rake db:create
または
$ docker-compose run web bin/rake db:create




いけた。

エラー文から推測して今回のやり方で解決しない方もいると思うので、根気強く解決法を探してみてください。