Docker Compose: Service failed to start
Docker Composeでサービスの起動に失敗した場合の原因と解決策
概要
Docker Composeで定義したサービスが起動に失敗する場合のエラーと解決方法です。
エラーメッセージ
``` ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint ```
原因
- ポートの競合: 既に使用中のポート
- 依存サービスの起動失敗: depends_onの順序問題
- ボリュームの権限問題: マウントしたディレクトリへのアクセス
- ネットワークの問題: カスタムネットワークの設定ミス
解決策
1. depends_onとhealthcheckを設定
```yaml
docker-compose.yml
version: ‘3.8’
services: db: image: postgres:15 environment: POSTGRES_PASSWORD: password healthcheck: test: [“CMD-SHELL”, “pg_isready -U postgres”] interval: 5s timeout: 5s retries: 5
web: build: . depends_on: db: condition: service_healthy ports: - “3000:3000” ```
2. ポートの競合を解決
```bash
使用中のポートを確認
lsof -i :3000
docker-compose.ymlでポートを変更
ports:
- “3001:3000” ```
3. ボリュームの権限を設定
```yaml services: web: volumes: - ./app:/app user: “${UID}:${GID}” # ホストのUID/GIDを使用 ```
```bash
.envファイル
UID=1000 GID=1000 ```
4. ログを確認
```bash
全サービスのログ
docker compose logs
特定サービスのログ
docker compose logs web
リアルタイムでログを追跡
docker compose logs -f web ```
5. クリーンアップして再起動
```bash
停止してボリュームも削除
docker compose down -v
イメージも含めて再ビルド
docker compose up –build –force-recreate ```
6. ネットワークの確認
```bash
ネットワーク一覧
docker network ls
詳細確認
docker network inspect myapp_default ```
よくある間違い
- depends_onだけでは起動順序を保証しない
- コンテナ内からlocalhostでDBに接続しようとする
- .dockerignoreがないためnode_modulesがコピーされる
関連エラー
関連エラー
Docker の他のエラー
この記事は役に立ちましたか?