postgresを使用しています。
docker-compose up -dをしたところ次のエラー。
WARNING: The POSTGRES_USER variable is not set. Defaulting to a blank string.
WARNING: The POSTGRES_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The HOST_OS_DATABASE_PORT variable is not set. Defaulting to a blank string.
WARNING: The HOST_OS_RAILS_PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.web.ports is invalid: Port ranges don't match in length
services.db.ports is invalid: Port ranges don't match in length
調べてみたがなし。
エラー文を訳してみる。
・使えるPOSTGRES_USERがセットされてない。
・POSTGRES_PASSWORDがセットされてない。
・The HOST_OS_DATABASE_PORTがセットされてない。
・The HOST_OS_RAILS_PORTがセットされてない。
パスワード関連なのでとりあえずdatabase.ymlとdocker-compose.yml、.envをチェック。
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
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:
原因
.envを見たところ、それぞれ環境変数を指定していなかったことが判明。
試しに登録したPOSTGRES_USERの値を.envで指定してみたところ、
WARNING: The POSTGRES_PASSWORD variable is not set. Defaulting to a blank string.
WARNING: The HOST_OS_DATABASE_PORT variable is not set. Defaulting to a blank string.
WARNING: The HOST_OS_RAILS_PORT variable is not set. Defaulting to a blank string.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.web.ports is invalid: Port ranges don't match in length
services.db.ports is invalid: Port ranges don't match in length
警告が一つ減った。したがって残り3つも登録した値を.envで指定する。
そしてdocker-compose up -d。
S:Portfolio sahota0701nemoto$ docker-compose up -d
Creating network "portfolio_default" with the default driver
Creating volume "portfolio_db-data" with default driver
Creating volume "portfolio_bundle-data" with default driver
Creating volume "portfolio_bundle" with default driver
Creating volume "portfolio_public" with default driver
Creating volume "portfolio_tmp" with default driver
Creating volume "portfolio_log" with default driver
Creating portfolio_db_1 ... done
Creating portfolio_chrome_1 ... done
Creating portfolio_web_1 ... done
通った。
推測ですが人によってはdocker内でpostgresユーザを作らなければ行けないのでPostgresqlのユーザを作成する方法についてはこちらの記事にまとめてあります。
次に遭遇したエラーはこちらの記事です