はじめに
Dockerの初歩を勉強中なのですが、勉強中に出たエラーとその解決法についてつらつらと書いていこうと思います。
インデント位置が間違えていたケース
エラー内容
$ docker-compose build
ERROR: The Compose file './docker-compose.yml' is invalid because:
Invalid top-level property "mysql". Valid top-level sections for this Compose file are: version, services, networks, volumes, secrets, configs, and extensions starting with "x-".
docker-compose build実行時に上記のエラーが発生。
以下docker-compose.ymlの記述
(注:分かりやすくするためコードを省略しています)
version: "3"
services:
rails:
build: .
> mysql:
> image: mysql:8.0
上記を見てもらえると分かると思いますが問題の原因は > で記述した部分です。
単純にインデントが揃って無かったことによるエラーでしたが、当初は全然意味が分からなくて解決までに相当時間を費やしました。(当初はインデントがずれてるくらいでまさかエラーにはならないだろうと思いこんでいたことが原因です。)
それと、エラー文からもInvalid top-level property "mysql"
**「無効なトップレベルプロパティ」(直訳)**という内容からも判断出来ます。
以下修正版
(注:分かりやすくするためコードを省略しています)
version: "3"
services:
rails:
build: .
mysql: < インデントを(rails)部分に揃える
image: mysql:8.0 < インデントを(build)部分に揃える
bundlerが原因のエラー
エラー内容
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.1.4) required by your /app/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.1.4`
from /usr/local/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
from /usr/local/bin/bundle:23:in `<main>'
ERROR: Service 'web' failed to build : The command '/bin/sh -c bundle install' returned a non-zero code: 1
こちらもエラー内容から判断出来ます。
run gem install bundler:2.1.4
という部分からgem install bundler:2.1.4
を実行してください。という内容なのでDockerfileにRUN gem install bundler
の記述を追加したらエラーが解消出来ました。(以下参照)
RUN gem install bundler >> これを追加
mysql-clientでエラー
エラー内容
E: Package 'mysql-client' has no installation candidate
ERROR: Service 'web' failed to build : The command '/bin/sh -c apt-get update -qq && apt-get install -y build-essential nodejs yarn mysql-client vim --no-install-recommends && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 100
E: Package 'mysql-client' has no installation candidate
MySQLをDBに使用していたのでDockerfile内にてmysql-client
の記述をしていたら上記のエラーが発生。has no installation candidate
を直訳したら「インストールの候補がありません」とのこと。
調べて見た所mysql-client
は、現在はmariadb-client
に統合されてしまっているとの情報がありました。
よって該当箇所をmariadb-client
に変更した所無事に解消しました。
Access denied for user 'root'(using password: YES)のエラー
エラー内容
Access denied for user 'root'@'192.168.~.~' (using password: YES)
Couldn't create 'app_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Access denied for user 'root'@'192.168.~.~' (using password: YES)
MySQLのアクセスが拒否されましたという内容のエラー。どのタイミングで発生したかちょっと忘れてしまったのですが多分docker-compose up
などのタイミングで発生したと思われます。
例によって調べていた所docker-compose.yml
内でvolumes
を使用していたのですがその部分が今回のエラーに関係していたみたいです。
docker-compose down --volumes
を使用してvolumesを一度削除したら無事に直りました。
以下が自分が使用したコマンド
docker-compose down -v
docker-compose up -d —-build
docker-compose run --rm web bundle exec rails db:create db:migrate db:seed
おわりに
Dockerを勉強し始めたのはいいものの、Dockerが相当難しくて自分でDockerfileやdocker-compose.ymlをこうやって少しは設定出来るまでには相当の時間と労力を費やしました。
今はまだ簡単な開発環境のDockerの設定しか出来ませんが、もっと勉強してさらにDockerについての理解を深めて行きたいと思っています。