【Docker】WARNING: The POSTGRES_USER variable is not set. Defaulting to a blank string.の解決法

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のユーザを作成する方法についてはこちらの記事にまとめてあります。

次に遭遇したエラーはこちらの記事です