はじめに
Dockerはとにかく頻繁にエラーが起こるので、備忘録として解決策をここに残したいと思います。
環境
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でサインアウトしていたことが原因でした。
コンテナを利用している際には特に問題にならなかったのでしばらく原因がわからずに困りました。
% 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」とありましたね…
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を指定して、ビルドと共にイメージの作成をしようとしてもできなくなりました。
以前はできていた気がするんですが…
services:
webserver:
build:
context: "."
dockerfile: "./docker/php-httpd/Dockerfile"
container_name: webserver
% 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
もしくは、イメージの作成とビルドを分けて実施する方法もあります。
services:
webserver:
image: sample-amazonlinux
container_name: webserver
% docker build --rm -t sample-amazonlinux .
[+] Building 2.2s (30/30) FINISHED
% 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も割り当てていたら大変なことになりますよ(経験者談)
そもそもDocker Desktopが起動しない!
DockでDocker Desktopのアイコンをクリックしても、なぜかDocker Desktopが起動しない。
アイコンがぴょんぴょん、と飛び跳ねて、そのまま終了…(伝わるかしら?)
エラーメッセージも何もないので、裏で動いているのかフリーズしているのかと「Appleメニュー() > アプリケーションの強制終了」で終了しようと思っても、そもそも「Docker Desktop」が表示されない・・・
解決策
「Finder > アプリケーション > ユーティリティ」内にある 「アクティビティモニタ」アプリを開くと、Docker Desktopが存在していました。
アクティビティモニタでDocker Desktopを選択し、「終了」すると、次からは正常にDocker Desktopの起動ができました。
おわりに
ビルドするたびに何かしらトラブルに見舞われるのはなんなんでしょうね?
参考