designetwork

ネットワークを軸としたIT技術メモ

Concourse image fetch failed - 誤キャッシュ (e3b0...) の対応方法

Concourseでキャッシュ状態が崩れ、指定したDocker Imageを取得できなくなる事象が発生した。 起因としてはプライベートDocker Registryとして使用しているSonatype Nexusの停止・リストアで、一時的にリソースが存在しなくなった時点の状態をキャッシュしてしまっていた。

対象Docker Imageのハッシュ値(ダイジェスト値)が空ファイルのもの e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 になってしまっていた。

参考)空ファイルのハッシュ値

$ touch test
$ sha256sum test
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  test

エラー内容

Pulling repo/image@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855...
Error response from daemon: manifest for repo/image@sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 not found: manifest unknown: manifest unknown

fly hijack でコンテナ内を確認すると以下のようになっている。

bash-5.1# cat /tmp/resource-in.xxxxxx
{"source":{"registry_mirror":"<MIRROR_URL>","repository":"<repo>/<image>","tag":"<tag>"},"version":{"digest":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}

※バージョンにより復旧手順が異なる場合があります。本作業によるデータロストの責任は負いかねますのでご了承ください。別環境での事前検証など十分な確認をお願いします。

バージョン情報

  • Concourse: 7.8.2
  • PostgreSQL: 14.4
  • Helm: bitnami/concourse:1.3.12 (bitnami/concourse:7.8.2-debian-11-r10)

サマリー

Concourse DBに保持されているキャッシュ情報が不適切な状態になっているので修正する。

  1. DBログイン
    PGPASSWORD=$POSTGRES_PASSWORD psql -hlocalhost -U$POSTGRES_USER -d$POSTGRES_DB
  2. 対象検索
    SELECT * FROM resource_config_versions WHERE version -> 'digest' = '"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"';
  3. 対象削除
    DELETE FROM resource_config_versions WHERE id = <id>;

参考

こちらのIssueの通り。 github.com

補足

対象検索

ハッシュ値不正のキャッシュを検索する。

テーブル構成詳細は割愛するが、以下のように検索できる。

bitnami_concourse=>  SELECT * FROM resource_config_versions WHERE version -> 'digest' = '"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"';
    id    |                                                version                                                 |           version_md5            | metadata | check_order | resource_config_scope_id | span_context
----------+--------------------------------------------------------------------------------------------------------+----------------------------------+----------+-------------+--------------------------+--------------
 44024666 | {"tag": "2.27.0", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | d76507934d45782f19cd44546624b0cd | null     |           3 |                       53 | {}
 44024672 | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}  | c37a599bcbe42369c372f33446c73947 | null     |           3 |                       96 | {}
 44025011 | {"digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}                  | bc45e9af82ab2ac6b3b8183ee808d5a6 | null     |           5 |                      710 | {}
 44023495 | {"tag": "2.26.0", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | b8eedb2e9c4d171f209dbeaa12ab6af9 | null     |           3 |                        3 | {}
 44024864 | {"tag": "latest", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | af8a5f2af320993447ab41f3fb9c7791 | null     |          27 |                       73 | {}
 44023427 | {"digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}                  | bc45e9af82ab2ac6b3b8183ee808d5a6 | null     |           3 |                        2 | {}

それぞれ誤キャッシュの chack_order が最大となっている。

bitnami_concourse=> SELECT * FROM resource_config_versions WHERE resource_config_scope_id = 53;
    id    |                                                version                                                 |       version_md5                | metadata | check_order | resource_config_scope_id | span_context
----------+--------------------------------------------------------------------------------------------------------+----------------------------------+----------+-------------+--------------------------+--------------
   254419 | {"tag": "2.27.0", "digest": "sha256:360c2246d1cc30a3c70566c355cc6d1a526ba45750890bfbdf6992f4e31e8609"} | a40d26d94a07b674663b8ab05757c9a2 | null     |           2 |                       53 | {}
 44024666 | {"tag": "2.27.0", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | d76507934d45782f19cd44546624b0cd | null     |           3 |                       53 | {}
(2 rows)

bitnami_concourse=> SELECT * FROM resource_config_versions WHERE resource_config_scope_id = 96;
    id    |                                                version                                                |      version_md5                 | metadata | check_order | resource_config_scope_id | span_context
----------+-------------------------------------------------------------------------------------------------------+----------------------------------+----------+-------------+--------------------------+--------------
   292819 | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} | cfb03bdebc85ce7ef747ffe431e711c7 | null     |           2 |                       96 | {}
 44024672 | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | c37a599bcbe42369c372f33446c73947 | null     |           3 |                       96 | {}
(2 rows)

対象チーム/パイプラインを確認

bitnami_concourse=> SELECT t.name, p.name, rcv.version, rcv.check_order
 FROM resource_types rt
 JOIN pipelines p ON p.id = rt.pipeline_id
 JOIN teams t ON t.id = p.team_id
 JOIN resource_config_scopes rcs ON rcs.resource_config_id = rt.resource_config_id
 JOIN resource_config_versions rcv ON rcv.resource_config_scope_id = rcs.id
 WHERE rcv.resource_config_scope_id = 53;
 name | name | version | check_order
------+------+---------+-------------
(0 rows)

bitnami_concourse=> SELECT t.name, p.name, rcv.version, rcv.check_order
 FROM resource_types rt
 JOIN pipelines p ON p.id = rt.pipeline_id
 JOIN teams t ON t.id = p.team_id
 JOIN resource_config_scopes rcs ON rcs.resource_config_id = rt.resource_config_id
 JOIN resource_config_versions rcv ON rcv.resource_config_scope_id = rcs.id
 WHERE rcv.resource_config_scope_id = 96;
 name  |      name      |                                                version                                                | check_order
-------+----------------+-------------------------------------------------------------------------------------------------------+-------------
 team1 | pipeline1      | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} |           2
 team1 | pipeline1      | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} |           3
 team2 | pipeline2      | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} |           2
 team2 | pipeline2      | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} |           3
 team2 | pipeline3      | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} |           2
 team2 | pipeline3      | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} |           3
 team2 | pipeline4      | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} |           2
 team2 | pipeline4      | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} |           3
 team2 | pipeline5      | {"tag": "1.3.6", "digest": "sha256:a7ce9724ff0fb49feaa1f6a4b6d21b8c24c03bddd975b1592b05815b02052d29"} |           2
 team2 | pipeline6      | {"tag": "1.3.6", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} |           3
(10 rows)

まとめて確認

SELECT t.name, p.name, rt.name, rcv.id, rcv.version, rcv.check_order
 FROM resource_types rt
 JOIN pipelines p ON p.id = rt.pipeline_id
 JOIN teams t ON t.id = p.team_id
 JOIN resource_config_scopes rcs ON rcs.resource_config_id= rt.resource_config_id
 JOIN resource_config_versions rcv ON rcv.resource_config_scope_id = rcs.id
 WHERE rcv.version -> 'digest' = '"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"'
 ORDER BY t.name, p.name, rcv.check_order DESC;

対象削除

check_order が最大となっている誤キャッシュのレコードを削除する。これにより、正常なキャッシュが利用されるようになる。

bitnami_concourse=> SELECT * FROM resource_config_versions WHERE resource_config_scope_id = 53;
    id    |                                                version                                                 |       version_md5                | metadata | check_order | resource_config_scope_id | span_context
----------+--------------------------------------------------------------------------------------------------------+----------------------------------+----------+-------------+--------------------------+--------------
   254419 | {"tag": "2.27.0", "digest": "sha256:360c2246d1cc30a3c70566c355cc6d1a526ba45750890bfbdf6992f4e31e8609"} | a40d26d94a07b674663b8ab05757c9a2 | null     |           2 |                       53 | {}
 44024666 | {"tag": "2.27.0", "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"} | d76507934d45782f19cd44546624b0cd | null     |           3 |                       53 | {}
(2 rows)


bitnami_concourse=> DELETE FROM resource_config_versions WHERE id = 44024666;
DELETE 1

bitnami_concourse=> SELECT * FROM resource_config_versions WHERE resource_config_scope_id = 53;
    id    |                                                version                                                 |       version_md5                | metadata | check_order | resource_config_scope_id | span_context
----------+--------------------------------------------------------------------------------------------------------+----------------------------------+----------+-------------+--------------------------+--------------
   254419 | {"tag": "2.27.0", "digest": "sha256:360c2246d1cc30a3c70566c355cc6d1a526ba45750890bfbdf6992f4e31e8609"} | a40d26d94a07b674663b8ab05757c9a2 | null     |           2 |                       53 | {}
(1 rows)