GitHubにPUSH及びプルリクマージしたらWebhookがPOSTリクエストを発行し、CodeBuildを使用して、GitHub上のソースコードを取得〜Dockerイメージのビルド〜ECRへのPUSHを行いたい。
しかし、
- AWSマネジメントコンソールからビルド開始すると問題なく成功するが、
- GitHubのWebHookが発行するPOSTリクエストからビルドを開始するとDockerデーモンに接続できない
という不具合が発生。
エラーコード:
[Container] Running command docker-compose build
Building xxxxx-app
Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
原因が意外だったので記しておきます。
そもそもwebhookとは?
「トリガーを引き金に、POSTリクエストを発行するサービス」と理解。
今回のケースだと、
(GitHubにプッシュまたはプルリクマージという)トリガーを引き金に、
(AWS Codebuildでビルドを開始する)POSTリクエストを発行する、
(GitHubの)サービス
ややこしかったのは、「AWS Codebuildでビルドを開始する」過程で、GitHubのソースコードをとってくる必要があり、AWS側でもGitHubのWebhookの設定をしていたことだ。トリガーを引いていたのはGitHubの方で、今回使用するWebhookはあくまでGitHubのサービスなのだ、ということを理解するのに時間がかかった。
概要は、これがわかりやすかったので詳細はこちらに譲る:
「Couldn’t connect to Docker daemon」のエラー解決までの道のり
エラーメッセージでググっても、「特権付与」をオンにすれば良い、という記事しか見つからない。オフィシャルなQ&Aにも出ている始末。
しかし、特権付与は既に有効にしてあり、何よりAWSマネジメントコンソールからであれば問題なくビルドできるので不思議。
その「成功するとき」と「失敗するとき」の差分がわからん。
もしかするとデフォルトDOCKER_HOSTが指定されていて、
それがwebhook経由だとなんらかの理由で見れなくなっているのかも…?
と(先輩が)思い、docker-compose buildの直前でenvコマンドを差し込み、環境変数を確認
[Container] Running command env
・
・
・
IMAGE=012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxx-app:rel-auto-branch/release/app-ab012c3
・
・
・
IMAGE_TAG=rel-auto-branch/release/app-ab012c3
・
・
・
CODEBUILD_WEBHOOK_TRIGGER=branch/release/app
・
・
・
(DOCKER_HOSTは出て来ず)
むむむ・・・!?
IMAGE_TAGに、/が含まれている・・・?
CircleCIとかだと、/は__に置換していたりします。
ただ、それでdockerデーモンに接続できないってことはなさそうだけれども・・・
(と先輩が気づく)
一応、buildspecファイルのpre_buildで定義しているIMAGE_TAGに、/が含まれないようにして、リトライ
→出来た!docker-compose build出来ました!!
なぜかはわからないけどできました。DockerのIMAGE_TAGに”/”(スラッシュ)を含めたらダメなんてどこかに書いてあるのでしょうか・・・?(調べたけど出てこず)
それがダメだとどうしてドッカーデーモンに接続できないのかもよくわからず・・・
検討したけどダメだった候補
- webhookのPOSTリクエストでは、Dockerデーモンが落ちている、という可能性
→Dockerデーモンの再起動
参考:https://jun-networks.hatenablog.com/entry/2020/12/01/142903 - webhookのPOSTリクエストだとカレントディレクトリが異なる、という可能性
→カレントディレクトリを比較&ディレクトリを指定
参考:https://qiita.com/kentosasa/items/3d75d26805fff8589472 - webhookの時だけ隠れファイル.bashrcで指定されたDOCKER_HOSTを参照してしまっている、という可能性
→通常どこを指定しているのかなど確認後、コメントアウトして再起動
参考:https://blog.logicky.com/2020/07/31/013155
今回学んだこと
- (結局本質的な原因はわかりませんでした)
- DockerのIMAGE_TAGに”/”(スラッシュ)を含めたらダメ
- 先輩の違和感は偉大
いくら調べても、インターネットでこんな可能性すら出て来なかったので、同じ悩みを持つ人の役に立てば幸いです。
コメント