[AI基礎解説]よく出るエラー辞典” Docker / WSL / Compose 編 — 症状→原因→対処(保存版)
ねらい:環境依存の地雷を“最短”で切り分け、再現→修正→再発防止まで型で回す。
対象:AI/WEBアプリ開発者(Mac / Windows + WSL2 / Linux)。
ゴール:症状 → 原因 → 対処をテンプレ化し、チーム全員が同じ手順で直せるようにする。
TL;DR(まずはこの順番で診断)
エンジンが動いているか
docker info / docker version
docker context ls(Docker Desktop / WSL / remote の切替ミスが多い)
単体コンテナで再現するか
docker run --rm -it alpine:3 sh(最小でネット/権限を確認)
ポート/ネットワーク
lsof -i :<PORT>(Mac/WSL) / netstat -ano | findstr :<PORT>(Win)
社内プロキシ/DNS/ファイアウォール
アーキとOS(ARM/AMD64)
exec format error / platform ミスマッチに注意
ボリューム/権限
UID/GID 食い違い、WSLの metadata 設定
Composeの記述と起動順
docker compose config で最終マージを確認
depends_on は起動順のみ(準備完了は見ない)。healthcheckで待つ
1. Docker デーモン/権限/接続
Cannot connect to the Docker daemon
原因:エンジン停止、ソケット権限、コンテキスト違い
対処:
Docker Desktopを起動(Mac/Win)
Linux:sudo systemctl status docker → sudo systemctl start docker
権限:sudo usermod -aG docker $USER(再ログイン)
docker context ls で目的のエンジンに切り替え
permission denied while trying to connect to the Docker daemon socket
原因:/var/run/docker.sock の権限
対処:上記の docker グループ設定+再ログイン/再起動
no space left on device(容量不足)
対処:
docker system df(使用量の内訳)
docker system prune -af --volumes(思い切って掃除/要注意)
画像・ボリュームの棚卸しを定期運用に
2. ビルド/実行のアーキテクチャ問題(ARM/AMD64)
exec format error / image operating system ‘linux/amd64’ cannot be used on this platform
原因:MシリーズMac=ARM64、WSL/多くのCI=AMD64。ミスマッチで起動不能
対処:
その場しのぎ:docker run --platform linux/amd64 <image>
Compose:
services: app: image: your/app:latest platform: linux/amd64
正攻法:マルチアーキでビルド(CIで --platform linux/amd64,linux/arm64)
QEMUエミュで極端に遅い
対処:開発はネイティブアーキ用のイメージを使う、重いワークロードは同アーキのVM/マシンへ。
3. ポート競合/ネットワーク
OSError: Address already in use / EADDRINUSE
原因:既に他プロセスが使用
対処:
Mac/WSL:lsof -i :8000 → kill <PID>
Windows:netstat -ano | findstr :8000 → タスクマネージャで終了
.env でポートを可変に
社内プロキシ/DNSでPull失敗/pip失敗
対処:
docker build --build-arg HTTP_PROXY=... --build-arg HTTPS_PROXY=...
Composeの build.args / environment で明示
DNS:/etc/resolv.conf を確認(WSLは後述)
pull access denied, repository does not exist or may require 'docker login'
原因:プライベートレジストリ/タグ名ミス
対処:docker login <registry>、タグを再確認
4. ボリューム/権限/改行(CRLF)
PermissionError / EACCES(ボリューム内)
原因:ホストとコンテナのUID/GID差
対処:
コンテナ側ユーザをホストと合わせる、または chown -R
開発用は :delegated ではなく標準マウントで挙動確認(Mac)
WSLは metadata オプション(後述)
.sh が ^M で動かない(/usr/bin/env: 'bash\r')
原因:CRLF 改行
対処:
Git:git config --global core.autocrlf input(Mac/WSL)
.gitattributes を用意
*.sh text eol=lf Dockerfile text eol=lf *.py text eol=lf
既存ファイルは dos2unix で変換
5. WSL2 特有の落とし穴(Windows)
WSLの状態を確認
wsl -l -v(ディストリとバージョン)
wsl --status / wsl --update / wsl --shutdown
プロジェクトは Linux 側に置く
原因:/mnt/c/... はI/O遅い
対処:\\wsl$\Ubuntu\home\<you>\project 配下に置く(体感で数倍速)
権限・パーミッションが崩れる
/etc/wsl.conf(ディストロ側)
[automount] options = "metadata,umask=22,fmask=11"
反映:wsl --shutdown → 再起動
DNS 解決が不安定
cat /etc/resolv.conf を確認
必要なら自動生成を無効にして手動指定(※要ネットワーク規約に沿う)
時計ズレでTLS/apt失敗
Windows側で時刻同期 → w32tm /resync、WSL再起動
Docker DesktopとWSLの整合
Docker Desktop設定で “Use the WSL 2 based engine” を有効化
開発用ディストロにチェック(Resources → WSL Integration)
.wslconfig(リソース制御、Win側ユーザディレクトリ)
[wsl2] memory=8GB processors=8 swap=4GB localhostForwarding=true
6. Dockerfile/ビルド文脈(context)の罠
巨大contextでビルドが終わらない
対処:.dockerignore を用意
.git __pycache__/ node_modules/ *.log .venv/
COPYの相対パス/WORKDIRミス
対処:WORKDIR /app → COPY . . の順番を固定し、意図通りか docker build ログで確認
キャッシュ無効化が必要
docker build --no-cache / docker compose build --no-cache
ベースイメージ更新は --pull を併用
7. Compose 特有の落とし穴(起動順・.env・override)
depends_on は“起動順”のみ(Ready ではない)
対処:healthcheck を付け、service_healthy で待つ
.env の場所/変数補間の勘違い
.env は composeファイルと同じディレクトリが原則
反映確認:docker compose config(最終的に展開された定義を出力)
匿名ボリュームでホストの変更が反映されない
対処:volumes: に明示のバインド(./src:/app/src)を使い、匿名ボリュームを消すなら docker compose down -v
ファイル分割・上書きの迷子
対処:docker compose -f compose.yml -f compose.prod.yml config で最終形を確認
YAMLのタブ混入(パース失敗)
対処:スペースのみ。エディタ設定でTab→スペース強制
再起動戦略がなく落ちたまま
対処:開発でも restart: unless-stopped を検討。原因調査は docker compose logs -f <svc>
8. トラブル切り分けテンプレ(コピペOK)
基本確認
docker info
docker version
docker context ls
docker system df
最小再現
docker run --rm -it alpine:3 sh
apk add --no-cache curl
curl -I https://example.com
ポート競合
# macOS/WSL
lsof -i :8000
# Windows(PowerShell)
netstat -ano | findstr :8000
Composeの実体を確認
docker compose config
docker compose ps
docker compose logs -f
クリーン再起動
docker compose down -v
docker compose up --build
9. 再発防止(チーム運用の型)
週1のお掃除(画像・ボリュームの棚卸し)
.dockerignore と .env.example を必ず配布
healthcheck を標準装備(DB/ブローカー系は特に)
YAMLレビュー(Tab禁止、変数名の一貫性)
WSLポリシー(プロジェクトはLinux側/metadata/LF固定)をドキュメント化
まとめ
まずは エンジン→単体コンテナ→ポート/ネット→アーキ→権限→Compose の順で切り分け。
docker compose config と healthcheck が“分からない動き”を減らす鍵。
WSLは置き場所とmetadata、CRLF/LFに気をつけるだけでトラブルの半分が消える。
次のおすすめ
#Docker #WSL2 #DockerCompose #トラブルシューティング #開発環境構築 #AI開発 #DevOps
