Docker勉強中に出たエラーと解決法の備忘録

# はじめに

Dockerの初歩を勉強中なのですが、勉強中に出たエラーとその解決法についてつらつらと書いていこうと思います。

## インデント位置が間違えていたケース
<font color=red>エラー内容</font color>

```zsh
$ 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の記述

```docker-compose.yml

（注：分かりやすくするためコードを省略しています）
version: "3"

services:
  rails:
    build: .

>    mysql:
>      image: mysql:8.0

```
上記を見てもらえると分かると思いますが問題の原因は <font color=red>＞</font color> で記述した部分です。
単純にインデントが揃って無かったことによるエラーでしたが、当初は全然意味が分からなくて解決までに相当時間を費やしました。(当初はインデントがずれてるくらいでまさかエラーにはならないだろうと思いこんでいたことが原因です。)
それと、エラー文からも`Invalid top-level property "mysql"`**「無効なトップレベルプロパティ」(直訳)**という内容からも判断出来ます。


<font color=red>以下修正版</font color>


```docker-compose.yml

（注：分かりやすくするためコードを省略しています）
version: "3"

services:
  rails:               
    build: .          

  mysql:              < インデントを(rails)部分に揃える
    image: mysql:8.0  < インデントを(build)部分に揃える

```


## bundlerが原因のエラー
<font color=red>エラー内容</font color>

```zsh

/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`の記述を追加したらエラーが解消出来ました。(以下参照)

```Dockerfile:Dockerfile

RUN gem install bundler >> これを追加
```

## mysql-clientでエラー

<font color=red>エラー内容</font color>

```zsh

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)のエラー

<font color=red>エラー内容</font color>

```zsh

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を一度削除したら無事に直りました。

以下が自分が使用したコマンド

```zsh

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についての理解を深めて行きたいと思っています。


# 参考サイト
- [docker-compose buildするときにbundle installやmysql-clientでコケた話](https://qiita.com/aseanchild1400/items/d3580366054fee3d2703)
- [docker + mysql が接続できない... Access denied for user 'homestead'@'172.20.0.1' (using password: YES)](https://qiita.com/fumi_042/items/7d1c14e335ab1c226e0f)