_NNN_
@_NNN_ (hehe hehe)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Top-level object must be a mapping とエラーが出てdocker-compose up -dができない

Q&A

Closed

最近phpについて触っていきたいと思い、php開発環境を整えようと思いdockerを使用して作ってみようと思い途中で題名のところのエラーで躓いたので質問です。
個人的にも調べましたが中々答えを見つけ出すことができず、大変お恥ずかしながらそもそもどこが間違ってるのかおかしいのかも分からない状態です、どなたかご教授お願いいたします。

php_testはdocker-compose.ymlがあるディレクトリファイルです
XXX@XXX php_test % docker-compose up -d
Top-level object must be a mapping
php-test
├── docker-compose.yml
├── mysql
│   └── data
├── nginx
│   └── nginx.conf
├── php
│   ├── Dockerfile
│   └── php.ini
└── www
   └── html
       └── index.php
docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      - ./www/html:/var/www/html
    depends_on:
      - php

  php:
    build: ./php
    volumes:
      - ./www/html:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    ports:
      - 13306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    ports:
      - 8888:80
    depends_on:
      - db

nginx.conf
server {
  listen 80;
  server_name _;

  root  /var/www/html;
  index index.php index.html;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

  location / {
      try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
      fastcgi_pass php:9000;
      fastcgi_index index.php;    
      fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      include       fastcgi_params;
  }
}

Dockerfile↓

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/
RUN docker-php-ext-install pdo_mysql

php.ini
date.timezone = "Asia/Tokyo"

リンク
https://github.com/nnnNNN4/php_test_.git

0

1Answer

Top-level object must be a mapping は docker-compose.yml の書式がおかしいことを表すエラーです。

しかし、ご質問の docker-compose.yml は正しいようですし、コードをコピーして手元で docker-compose up -d すると正しく起動しました。ご質問のコードやエラーメッセージと現在の状況に相違はありませんか?

0Like

Comments

  1. @_NNN_

    Questioner

    ありがとうございます、念の為コード確認をしましたが間違っておりません
    そしてもう一度該当のコマンドを実行してみましたが、結果は変わりませんでした
  2. > php_testはdocker-compose.ymlがあるディレクトリファイルです
    > XXX@XXX php_test % docker-compose up -d

    > php-test
    > ├── docker-compose.yml

    php_test と php-test があったりしませんか?

    そうでないとするとこれ以上はちょっと分からないですね。現在のソースコードをまとめて GitHub かどこかに置いてもらえるともう少し調査できるかもしれません。

    参考までに、こちらの環境を書いておきます。

    % docker-compose version
    docker-compose version 1.29.2, build 5becea4c
    docker-py version: 5.0.0
    CPython version: 3.9.0
    OpenSSL version: OpenSSL 1.1.1h 22 Sep 2020
  3. @_NNN_

    Questioner

    php-testはphp_testの記入ミスでした、すいません。
    php_test と php-test があったりするようなことはありませんでした。
    githubのurlを追記しましたのでご調査していただけると助かります。
  4. アップロードありがとうございます。 docker-compose.yml 他の内容が空になっているようです。
  5. @_NNN_

    Questioner

    すいません、うまくアップロードできてなかったようです。
    今直しましたので申し訳ありませんが再度お願いします。
    URL貼り直しました。
  6. @_NNN_

    Questioner

    再起動したら無事に起動しました、今回は対応してくださりありがとうございました。
  7. 確認しました。やはり正常に起動できます。試しに docker-compose.yml を空にして起動すると同じエラーが出ました。

    % echo '' > docker-compose.yml

    % docker compose up
    Top-level object must be a mapping

    % docker-compose up
    ERROR: Top level object in './docker-compose.yml' needs to be an object not '<class 'NoneType'>'.

    ちなみに compose コマンドは2種類あります。 docker-compose コマンドはバージョン1で、バージョン2は Docker 本体に吸収されて docker compose になりました。

    バージョンでエラーメッセージが違い、ご質問のエラーはバージョン2が出すのと同じですが、実行したコマンドは docker-compose up -d なのでバージョン1のはずです。このあたりの食い違いの理由は分かりません。

    また試しに docker-compose.yml に適当なリストを書き込んでみました。

    % echo '- foo' > docker-compose.yml

    % docker compose up
    Top-level object must be a mapping

    % docker-compose up
    ERROR: Top level object in './docker-compose.yml' needs to be an object not '<class 'list'>'.

    バージョン2のエラーは変わらず、バージョン1は最後のほうが変わっています。

    さらに、ログは省きますが、 echo '{}' > docker-compose.yml で適当なマッピングを書き込んだ場合と rm docker-compose.yml で削除した場合も試しました。これらは無関係な別のエラーを出しました。
  8. 以上から分かるのは、 docker-compose up -d が docker-compose.yml とは異なる何らかの YAML ファイルを読み込んでいるらしいことです。

    読み込むファイルを指定する環境変数 COMPOSE_FILE が定義されていませんか?
    https://docs.docker.jp/compose/reference/envvars.html#compose-file

    また docker-compose が compose バージョン2を起動しているのも若干気になります。

    docker-compose がエイリアスかシェルスクリプトになっていて、その中で環境変数または -f オプションで別のファイルを指定している可能性はありませんか?
  9. 入れ違いでした。上のコメントは無視してください。
  10. @_NNN_

    Questioner

    自分の記憶してる限りでは、特に特別な操作(別のファイルを指定するなど)はしてないので多分ないかなと思います。
    バージョン違いがあるのは今初めて知りました、dockerは最新のものを入れてました。
  11. なるほど、参考になります。再起動しないとこういうエラーも起きうると覚えておきます。

Your answer might help someone💌