🟣
Docker Desktop → Orbstack移行時のHasura接続問題に立ち向かう
対象読者
- Docker Desktop を使用していて、Orbstackに乗り換えを検討している方
- HasuraやGraphQL環境を構築している方
要約
問題
Docker DesktopからOrbStackへの移行後、HasuraからバックエンドサービスへのAction呼び出しが失敗。
原因
Hasuraの環境変数がDocker Desktop特有の設定(gateway.docker.internal
)を使用していた。
解決策
docker-compose.yml
ファイル内のHasura環境変数を環境非依存の設定(http://web:1324
)に変更。
1. 問題の特定
症状
- HasuraからバックエンドサービスへのAction呼び出しが失敗する
- エラーメッセージ: "接続できません"または特定のタイムアウトエラー
環境
- 移行前: Docker Desktop
- 移行後: OrbStack
- 影響を受けたサービス: Hasura (graphql-engine)、バックエンドサービス (web)
実行したコマンド
docker-compose ps
このコマンドで、すべてのサービスが起動していることを確認しました。
2. 原因の分析
調査手順
- サービスの状態確認
- Hasuraコンテナ内からバックエンドサービスへの接続テスト
- 環境変数の確認
実行したコマンド
# Hasuraコンテナにアクセス
docker-compose exec graphql-engine sh
# コンテナ内でバックエンドサービスへの接続テスト
curl http://web:1324/v1/ping
# 環境変数の確認
env | grep ACTION_BASE_ENDPOINT
発見事項
- Hasuraの環境変数
ACTION_BASE_ENDPOINT
とADMIN_ACTION_BASE_ENDPOINT
がhttp://gateway.docker.internal:1324
を指していた - この設定はDocker Desktop特有のもので、OrbStackでは機能しない
3. 解決策の実装
修正内容
docker-compose.yml
ファイル内のHasura環境変数を以下のように変更
graphql-engine:
...
environment:
...
ACTION_BASE_ENDPOINT: http://web:1324
ADMIN_ACTION_BASE_ENDPOINT: http://web:1324
...
実施手順
-
docker-compose.yml
ファイルを編集 -
以下のコマンドで既存のコンテナを停止し、新しい設定でコンテナを起動
docker-compose down docker-compose up -d
-
Hasuraコンテナ内で環境変数を確認
docker-compose exec graphql-engine sh env | grep ACTION_BASE_ENDPOINT
-
バックエンドサービスへの接続テスト実行
curl http://web:1324/v1/ping
4. 検証
テスト方法
-
HasuraコンソールからActionを実行
-
curl コマンドでバックエンドサービスに直接アクセス:
curl http://web:1324/v1/ping
結果
- Actionの実行が成功
- curlコマンドでの直接アクセスも成功(応答:
{"message":"pong"}
)
5. 予防策と推奨事項
- 環境非依存の設定使用
- サービス名を直接指定する(例:
http://web:1324
) - 特定の環境に依存するDNS名(例:
gateway.docker.internal
)の使用を避ける
- サービス名を直接指定する(例:
- 定期的な接続テスト
-
CI/CDパイプラインに以下のテストを組み込む:
docker-compose exec graphql-engine curl http://web:1324/v1/ping
-
開発環境セットアップ時に上記の接続テストを実行する
-
- ドキュメント更新:
-
README.md
に正しい環境変数設定を記載 - トラブルシューティングガイドにこの問題と解決策を追加
-
- チーム内での知識共有:
- この問題と解決策について、チームミーティングで共有
- 新メンバーのオンボーディング資料に追加
6. 学んだ教訓
- Docker環境の違いが予期せぬ問題を引き起こす可能性がある
- 環境に依存しない設定を使用することで、移植性と安定性が向上する
- 問題発生時の系統的なトラブルシューティングの重要性
7. 追加のトラブルシューティングコマンド
問題が再発した場合や、類似の問題に遭遇した場合に役立つ可能性のある追加のコマンド
# Dockerネットワークの一覧表示
docker network ls
# 特定のネットワークの詳細情報表示
docker network inspect enpay-account-transfer_default
# Docker composeの設定確認(環境変数なども表示)
docker-compose config
# 特定のサービスのログ表示
docker-compose logs graphql-engine
docker-compose logs web
# コンテナ内でのネットワーク診断(必要に応じてパッケージをインストール)
docker-compose exec graphql-engine apk add --no-cache iputils
docker-compose exec graphql-engine ping web
参考記事
Discussion