初めに
学習中のエラーを自分でまとめてみました
なるべくわかりやすく説明していこうと思います。
背景
dockerを利用して、Railsアプリケーションとpostgresをセットアップをして実行する。
docker-compose buildの際にエラーが生じた。
docker-compose.yml
version: '12' volumes: db-data: services: db: image: postgres environment: POSTGRES_PASSWORD:password volumes: - 'db-data:/var/lib/postgresql/data' web: build: . command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/workdir ports: - "3000:3000" depends_on: - db tty: true stdin_open: true
database.yml
default: &default adapter: postgresql encoding: unicode host: db user: postgres port: 5432 password: <%= ENV.fetch("DATABASE_PASSWORD") %> # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
エラー内容
validating /Users/seinokyouhei/Desktop/practice/rails7_docker_template/docker-compose.yml: services.db.environment must be a mapping
docker-compose.ymlのservices、db、enviromentの部分でエラーが生じていることがわかる。
mappingはenviromentのキーと値の組み合わせ構造のこと
つまり組み合わせ構造が間違っていると予想ができる。
解決策
- enviromentの構造に-が抜けていたため。
改善後のdocker-compose.yml
version: '12' volumes: db-data: services: db: image: postgres environment: - POSTGRES_PASSWORD:password volumes: - 'db-data:/var/lib/postgresql/data' web: build: . command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/workdir ports: - "3000:3000" depends_on: - db tty: true stdin_open: true
結語
ymlではオブジェクトや辞書型データのキーと値の組み合わせ構造のことをマッピングと呼ぶ
must be a mappingはymlの構造上のエラーである。