Dockerビルド時のエラーあれこれ

# はじめに
Dockerはとにかく頻繁にエラーが起こるので、備忘録として解決策をここに残したいと思います。

# 環境
```terminal:OS
macOS Ventura 13.4 → macOS Sonoma 14.3.1
チップ Apple M1
```

# Docker Desktopでサインアウトした事によるビルドの失敗

Dockerコンテナを再ビルドしようと`docker compose up -d`を実行したところ、下記のようなエラーに悩まされました。

```
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: rpc error: code = Unknown desc = error getting credentials - err: exit status 1, out: ``
```

これには色々なパターンがあるようですが、私の場合はDocker Desktopでサインアウトしていたことが原因でした。
コンテナを利用している際には特に問題にならなかったのでしばらく原因がわからずに困りました。

```console
% docker compose up -d
[+] Building 0.6s (4/6)                                                                                                        
 => [project-mariadb internal] load build definition from Dockerfile                                                0.0s
[+] Building 0.7s (6/6) FINISHED                                                                                               
 => [project-mariadb internal] load build definition from Dockerfile                                                0.0s
 => => transferring dockerfile: 31B                                                                                 0.0s
 => [project-webserver internal] load build definition from Dockerfile                                              0.0s
 => => transferring dockerfile: 79B                                                                                 0.0s
 => [project-mariadb internal] load .dockerignore                                                                   0.0s
 => => transferring context: 2B                                                                                     0.0s
 => [project-webserver internal] load .dockerignore                                                                 0.0s
 => => transferring context: 2B                                                                                     0.0s
 => ERROR [project-mariadb internal] load metadata for docker.io/library/mariadb:10.4                               0.6s
 => ERROR [project-webserver internal] load metadata for docker.io/library/amazonlinux:2.0.20220121.0               0.6s
------
 > [project-mariadb internal] load metadata for docker.io/library/mariadb:10.4:
------
------
 > [project-webserver internal] load metadata for docker.io/library/amazonlinux:2.0.20220121.0:
------
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: rpc error: code = Unknown desc = error getting credentials - err: exit status 1, out: ``
```

## 解決策

Docker Desktopの「Sign in」からWEBサイトへアクセスし、ログイン。
その後WEBサイトからDocker Desktopを立ち上げると、ビルドコマンドが通るようになりました。

エラー内容をよく読むと「error getting credentials」とありましたね…

https://login.docker.com/u/login

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/7ac654de-6668-664f-f82b-a6294ee4ce36.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/144b066d-cd12-dfe2-183f-324fd5c30f46.png)

# `docker-compose`が使えない

`docker-compose`コマンドで`command not found`が表示される！

```console
% docker-compose up --build -d
zsh: command not found: docker-compose

% docker-compose version
zsh: command not found: docker-compose
```

## 解決策
`docker-compose`をインストールしてやりましょう。そのままですね。

```console
% brew install docker-compose
==> Auto-updating Homebrew...
Adjust how often this is run with HOMEBREW_AUTO_UPDATE_SECS or disable with
HOMEBREW_NO_AUTO_UPDATE. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> New Formulae
dra                 fierce              grizzly             pyupgrade
==> New Casks
font-ibm-plex-math         font-ibm-plex-sans-tc      font-scientifica

You have 81 outdated formulae installed.

...
```

# 管理者権限がない事によるビルドの失敗

プロジェクトのディレクトリによっては、管理者権限がないために`docker-compose up -d`の実行時にエラーが発生することがありました。

```console
% docker-compose up -d
open /Users/fakefurcoronet/.docker/buildx/current: permission denied
```

## 解決策
~~この場合は`sudo`コマンドで実行してやることでビルドできます。~~

そもそも、Docker Desktop は非rootユーザーに代わって実行されているため、`sudo`は必要ないそうです。

https://forums.docker.com/t/error-failed-to-solve-error-getting-credentials-err-exit-status-1-out/136124

ファイル権限が壊れた状態で`sudo`をつけてビルドを行なっても、

```failed to solve: composer:latest: failed to resolve source metadata for docker.io/library/composer:latest:```

という厄介なエラーが出て解決できない事がありました。

```console
% sudo docker-compose up --build -d
[+] Building 0.6s (4/5)                                    docker:desktop-linux
[+] Building 0.7s (5/5) FINISHED                           docker:desktop-linux
 => [backend internal] load build definition from Dockerfile               0.0s
 => => transferring dockerfile: 1.03kB                                     0.0s
 => [batch internal] load build definition from Dockerfile                 0.0s
 => => transferring dockerfile: 703B                                       0.0s
 => [frontend internal] load build definition from Dockerfile              0.0s
 => => transferring dockerfile: 1.19kB                                     0.0s
 => ERROR [backend internal] load metadata for docker.io/library/composer  0.6s
 => [frontend internal] load metadata for docker.io/library/php:8.3-fpm    0.0st
------
 > [backend internal] load metadata for docker.io/library/composer:latest:
------
failed to solve: composer:latest: failed to resolve source metadata for docker.io/library/composer:latest: error getting credentials - err: exit status 1, out: ``
```

この場合、誤った権限で作成されたファイルやディレクトリが存在するため、
ビルド時のキャッシュ削除や、権限エラーになっているファイルの権限を非rootユーザーに変える、または問題なければファイル自体を削除するなどの対応が良さそうです。

権限を修正して改めて`sudo`なしでビルドを行う事でうまくいきました。

```console
% sudo chown {User Name} /Users/fakefurcoronet/.docker/buildx/current 
```

# ビルドとイメージ作成を同時にしようとした事によるビルドの失敗

いつ頃からか、下記のようにdocker-compose.ymlでDockerfileを指定して、ビルドと共にイメージの作成をしようとしてもできなくなりました。
以前はできていた気がするんですが…

```yml:docker-compose.yml
services:
  webserver:
    build:
      context: "."
      dockerfile: "./docker/php-httpd/Dockerfile"
    container_name: webserver
```

```console
% docker-compose up -d
[+] Building 0.6s (2/3)                                                                 
[+] Building 0.7s (3/3) FINISHED                                                        
 => [internal] load .dockerignore                                                  0.0s
 => => transferring context: 2B                                                    0.0s
 => [internal] load build definition from Dockerfile                               0.0s
 => => transferring dockerfile: 2.95kB                                             0.0s
 => ERROR [internal] load metadata for docker.io/library/amazonlinux:2             0.6s
------
 > [internal] load metadata for docker.io/library/amazonlinux:2:
------
failed to solve: error getting credentials - err: exit status 1, out: ``
```

## 解決策
`docker pull`コマンドで直接レジストリからイメージを取得する事で解決できます。

```console
% docker pull amazonlinux:2
```

もしくは、イメージの作成とビルドを分けて実施する方法もあります。

```yml:docker-compose.yml
services:
  webserver:
    image: sample-amazonlinux
    container_name: webserver
```

```console
% docker build --rm -t sample-amazonlinux .
[+] Building 2.2s (30/30) FINISHED
```

```console
% docker-compose up -d
Password:
[+] Running 3/4
 ✔ Network sample_default          Created                                         0.1s 
 ✔ Volume "sample_db_data"         Created                                         0.0s 
 ✔ Container mariadb               Started                                         1.5s 
 ⠿ Container webserver             Starting                                        1.4s 
Error response from daemon: driver failed programming external connectivity on endpoint webserver (60b1d23d6b166d29850863d29cfd7832b255a74a9d4a21c9d9b3ed0bac21f51d): Bind for 0.0.0.0:443 failed: port is already allocated
```

# コンテナが起動後にすぐ停止してしまう

ようやくビルドは成功したのに、コンテナが起動後にすぐに停止してしまう…なぜなのか。

Docker Desktopでコンテナのログを確認すると下記のようなエラーが、、、

```
Uncaught Error: Failed opening required '/var/www/vendor/autoload.php'
```

どうやら`RUN composer install`が正しく実行されていないのか、コンテナ起動時に実行する`artisan`コマンドに失敗しているようでした。
ビルド時にはエラー出ていないんだけどなぁ…

```Dockerfile
略...

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www

COPY . .

RUN composer install --no-dev --optimize-autoloader \
    && php artisan octane:install --server=frankenphp

EXPOSE 8080

CMD ["php", "artisan", "octane:frankenphp", "--host=0.0.0.0", "--port=8080", "--quiet"]
```

## 解決策
まず、コンテナ起動時のコマンドをコメントアウトして、ビルド`docker-compose up --build -d`します。

```Dockerfile
# CMD ["php", "artisan", "octane:frankenphp", "--host=0.0.0.0", "--port=8080", "--quiet"]
```

無事に起動したコンテナに入り、失敗しているであろうcomposerのインストールを手動で実施します。

```console
# cd /var/www/
# composer install --no-dev --optimize-autoloader
# php artisan octane:install --server=frankenphp
```

最後に、先ほどコメントアウトしたDockerfileを元に戻して再ビルドすれば、以降は問題なくコンテナが起動してくれます。

# コンテナが起動後にすぐ停止してしまう - その2

先日まで問題なく動いていたコンテナが、ある日突然、起動後にすぐに停止してしまう様になった。
はたまた、ビルドが成功したとコンテナが、なぜか起動できない。

そのDocker Desktop、ディスク容量は足りてますか？


例えば、コンテナのログに下記のようなメッセージが残っていたり、

```
java.nio.file.FileSystemException: /tmp/opensearch-9379509637292366103: No space left on device
```

ビルド時に下記の様なメッセージが出ている場合、ディスク容量の割り当て不足かもしれません。

```
3.173 E: You don't have enough free space in /var/cache/apt/archives/.
```

## 解決策

「Settings > Resources > Advanced」で`Disk usage limit`をあげてやりましょう。
※Docker Engineの`defaultKeepStorage`の値を変えるだけではダメ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/557981ea-a946-4907-91e4-ff99c9516fa6.png)

# マウントしたフォルダ内にファイルが存在しない

これはMac限定かもしれません。

Docker Desktop自身にフォルダやファイルへのアクセス権がなく、コンテナからファイルを見ることができない、という事がありました。

例えば、ボリュームのマウントは問題なく、実際のフォルダにも`composer.json`があるのに、コンテナから`composer install`すると失敗してしまうのです。

```
# composer install
Composer could not find a composer.json file in /var/www/html
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
```

これはマウントさせているローカルフォルダがどこか、によって発生する様です。（書類フォルダやダウンロードフォルダなど）

PC依存の事象のため、問い合わせがあった際に地味に解決に時間を要しました。

## 解決策
Macの「システム環境設定… > プライバシーとセキュリティ > ファイルとフォルダ」で、マウントさせているフォルダを許可してやりましょう。


# Docker Desktopのバージョンを上げた事によるアプリの起動失敗

Docker Desktopのバージョンを`4.20.1`へ上げた際に、アプリを起動すると`docker failed to run backend processes`というエラーが表示されて、Docker Desktopが起動しない問題に悩まされました。

:::note info
このトラブルは`4.33.0`では再現しませんでした。
:::

```
supervising tasks: task failed: shutdown with exit code 1: com.docker.build with pid: 771
```

## 解決策
`kill`コマンドでアプリを強制的に落とすと解消される…なんて記事もありましたが、強制終了しようが再起動しようが再インストールしようがダメでした。。。

結局、バージョンを`4.19.0`に落としました。解決になってない！

https://docs.docker.com/desktop/release-notes/#4190

~~今後のアップデートで解消されることを祈ります。~~
アップデートで解消済み！

# とにかく色々重たい！！
PCのメモリが100％近くて重い！
Docker Desktopが頻繁に落ちる！
Laravelのキャッシュが全然クリアされない！（コンテナ再起動でクリアされる）

などなど、PCのメモリは多めに積んでいるのに、動作の重さに悩まされる場合…Dockerがメモリを食い過ぎなのではないでしょうか？

## 解決策
「Settings > Resources > Advanced」にあるCPU、メモリ、スワップの上限を、マシンの性能と相談しつつ変更しましょう。

VSCodeでコードを書いてChromeで表示確認する…程度であれば多めに割り当てても良いかと思いますが、

実際にはモニタは複数あるし、Chromeは大量にタブを開きっぱなしだし、デザインはXDで確認するし、Excelで仕様書も確認するし、チャットツールはSlack・Teams・LINEと色々立ち上げてるし…なんて事もあるでしょう！
たとえマシンのメモリが16GBあっても、Dockerに8GBも割り当てていたら大変なことになりますよ（経験者談）:sweat:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186115/81cabf48-ff51-47f9-02ba-cb30c6ab7605.png)

# そもそもDocker Desktopが起動しない！

DockでDocker Desktopのアイコンをクリックしても、なぜかDocker Desktopが起動しない。
アイコンがぴょんぴょん、と飛び跳ねて、そのまま終了…（伝わるかしら？）

エラーメッセージも何もないので、裏で動いているのかフリーズしているのかと「Appleメニュー（） > アプリケーションの強制終了」で終了しようと思っても、そもそも「Docker Desktop」が表示されない・・・

## 解決策

「Finder > アプリケーション > ユーティリティ」内にある 「アクティビティモニタ」アプリを開くと、Docker Desktopが存在していました。

アクティビティモニタでDocker Desktopを選択し、「終了」すると、次からは正常にDocker Desktopの起動ができました。

# おわりに

ビルドするたびに何かしらトラブルに見舞われるのはなんなんでしょうね？

# 参考

https://stackoverflow.com/questions/74583214/docker-failed-to-solve-with-frontend-dockerfile-v0-failed-to-create-llb-defin/74988537