docker-compose build時に services.db.environment must be a mappingというエラーが生じる。

初めに

  • 学習中のエラーを自分でまとめてみました

  • なるべくわかりやすく説明していこうと思います。

背景

  • 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の構造上のエラーである。