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
いけた。
エラー文から推測して今回のやり方で解決しない方もいると思うので、根気強く解決法を探してみてください。