【TIPs】【意外な解決策】GitHubのWebhookを経由してAWS Codebuildでdocker-compose buildするとドッカーデーモンに接続できない。

【TIPs】【意外な解決策】GitHubのWebhookを経由してAWS Codebuildでdocker-compose buildするとドッカーデーモンに接続できない。 AWS
【TIPs】【意外な解決策】GitHubのWebhookを経由してAWS Codebuildでdocker-compose buildするとドッカーデーモンに接続できない。

GitHubにPUSH及びプルリクマージしたらWebhookがPOSTリクエストを発行し、CodeBuildを使用して、GitHub上のソースコードを取得〜Dockerイメージのビルド〜ECRへのPUSHを行いたい。

しかし、 

  1. AWSマネジメントコンソールからビルド開始すると問題なく成功するが、
  2. 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のサービスなのだ、ということを理解するのに時間がかかった。

概要は、これがわかりやすかったので詳細はこちらに譲る:

Webhookとは? - Qiita
Webhookを利用した記事はよく見かけますが、そもそもWebhook自体が何なのか、何を指しているのかよくわからなかったため、それに関しての備忘録です。 Webhookとは? アプリケーションの更新情報を他のアプリケーション...
Webhookって何?を子どもでもわかるように描いてみた
はじめに こんにちは。最近娘に絵本を読むのがめんどくさいダン吉です。今日は、巷で話題のWebhookとは何かをわかりやすく伝えるために、画力に圧倒的に自信のない私が恥を覚悟で、子どもによく描いてあげる...

「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に”/”(スラッシュ)を含めたらダメなんてどこかに書いてあるのでしょうか・・・?(調べたけど出てこず)

それがダメだとどうしてドッカーデーモンに接続できないのかもよくわからず・・・

検討したけどダメだった候補

  1. webhookのPOSTリクエストでは、Dockerデーモンが落ちている、という可能性
    →Dockerデーモンの再起動
    参考:https://jun-networks.hatenablog.com/entry/2020/12/01/142903
  2. webhookのPOSTリクエストだとカレントディレクトリが異なる、という可能性
    →カレントディレクトリを比較&ディレクトリを指定
    参考:https://qiita.com/kentosasa/items/3d75d26805fff8589472
  3. webhookの時だけ隠れファイル.bashrcで指定されたDOCKER_HOSTを参照してしまっている、という可能性
    →通常どこを指定しているのかなど確認後、コメントアウトして再起動
    参考:https://blog.logicky.com/2020/07/31/013155

今回学んだこと

  • (結局本質的な原因はわかりませんでした)
  • DockerのIMAGE_TAGに”/”(スラッシュ)を含めたらダメ
  • 先輩の違和感は偉大

いくら調べても、インターネットでこんな可能性すら出て来なかったので、同じ悩みを持つ人の役に立てば幸いです。

この記事を書いた人
こもれびエンジニア

自然と自由を愛するエンジニア。2021年1月に、大手製造業設計からプログラマ(Rails, AWS)へ転職。動物や自然との触れ合いや、汗を流すのが好き。

/HSP(繊細さん)/18デリケートな象/ストレングスファインダー(1分析思考/2親密性/3学習欲/4調和性/5収集心)、テニス、合気道、登山、あいだみつを、ジブリ、ワンピース、ドラゴンボール、Ruby on Rails、アイミング

はるすとをフォローする
AWS
スポンサーリンク
はるすとをフォローする
「そんなか」サイト

コメント

タイトルとURLをコピーしました