【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のユーザを作成する方法については[こちらの記事](https://qiita.com/shota0701nemoto/items/06a88f9cd65a716098fe#postgresql%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%A4%E3%81%BE%E3%81%A5%E3%81%84%E3%81%9F%E9%83%A8%E5%88%86)にまとめてあります。


次に遭遇したエラーは[こちらの記事です](https://qiita.com/shota0701nemoto/items/696393028fe77bf356bb)


 http://code-aim.work/docker-warning-the-postgres_user-variable-is-not-set-defaulting-to-a-blank-string