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に保持されているキャッシュ情報が不適切な状態になっているので修正する。
- DBログイン
PGPASSWORD=$POSTGRES_PASSWORD psql -hlocalhost -U$POSTGRES_USER -d$POSTGRES_DB
- 対象検索
SELECT * FROM resource_config_versions WHERE version -> 'digest' = '"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"';
- 対象削除
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)