5
6

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

Last updated at Posted at 2023-03-10

はじめに

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

環境

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でサインアウトしていたことが原因でした。
コンテナを利用している際には特に問題にならなかったのでしばらく原因がわからずに困りました。

% sudo 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」とありましたね…

image.png

image.png

docker-composeが使えない

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

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

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

解決策

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

% 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の実行時にエラーが発生することがありました。

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

解決策

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

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

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

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

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

% 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なしでビルドを行う事でうまくいきました。

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

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

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

docker-compose.yml
services:
  webserver:
    build:
      context: "."
      dockerfile: "./docker/php-httpd/Dockerfile"
    container_name: webserver
% sudo 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コマンドで直接レジストリからイメージを取得する事で解決できます。

% docker pull amazonlinux:2

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

docker-compose.yml
services:
  webserver:
    image: sample-amazonlinux
    container_name: webserver
% docker build --rm -t sample-amazonlinux .
[+] Building 2.2s (30/30) FINISHED
% sudo 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コマンドに失敗しているようでした。
ビルド時にはエラー出ていないんだけどなぁ…

略...

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します。

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

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

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

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

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

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

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

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

解決策

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

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

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

とにかく色々重たい!!

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

そもそもDocker Desktopが起動しない!

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

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

解決策

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

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

おわりに

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

参考

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6