{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/114",
    "result": {"data":{"issuesJson":{"id":"f01047e8-e199-5bcf-814f-b8331ee8a8c6","title":"wagoodman/dive: 用于探索分析 docker 镜像、分层内容以及发现缩小 Docker/OCI 镜像大小的方法的工具","number":114,"bodyHTML":"<div align=\"center\" dir=\"auto\">\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a><br><br></p>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th align=\"right\">Repos</th>\n<th align=\"left\"><a href=\"https://github.com/wagoodman/dive\">wagoodman/dive</a></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"right\"><strong>Views</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/9e8eb96a6735a00153d2eb8f8d0d94da9efc2be5b85e21e5548d390f89a7c023/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f7761676f6f646d616e2f646976652e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/wagoodman/dive.svg\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Stars</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/549f562aa58f1268165a9e11060fe8dc2e058bd42b6163fabab4e7de72b90416/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f7761676f6f646d616e2f646976653f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/wagoodman/dive?color=f2f08d&amp;logo=Undertale&amp;logoColor=eb4630\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Forks</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/c5fe6f853b25b339301e7adafbd8a147808469bedcc7e785d37a64dc98e3613c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f7761676f6f646d616e2f646976653f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/wagoodman/dive?color=ba86eb&amp;logo=Handshake&amp;logoColor=ea6aa6\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>License</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/c9dd921b4a943509fe4678e3c5164296da4c3626f7988461507bf7b675a20cdd/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f7761676f6f646d616e2f646976653f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/wagoodman/dive?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3klEQVR4nO3YSUzUUBgH8JroWVrUGJfEm7sXNcSDFxMTL2pi4sHEgxeNRowXgpEWBDURR%2BNANOKOK66ooKJGBXeEGRcWAcEVFGQRHFwQmH5%2F0wHaeWHI9DUDU5L5knehdOb7zfe%2B19cnCJGIRCQiEYlQB7YJIyGL8aosulVZ6iRFQjiGKkudWg5aLlpOppNXnfPqw5U0DYRJmVxjCgFF3BLuZGmAoVUiKEArmX7D7USgsQporgGa3gHfK4H6cuBbCVD3Gqh1A5%2BLgE%2BFwIenQM0joDofqLoHVNwBym8CpTnAm2zQq0sgdxbIdQZUlAkqPAZ6dgj05ADoYRoofy%2FoXiro7k5QXjLopgzKiQNlLDaqoIguEwBjzqP5PfDjE9DyIXyI63FMTwQFMCVrqwNav4QfoRg58QF%2BfrMHQrEK8DToCMqNAyWNHfxmTRoLOrmSRVgGtDfqCEqZOHQrzo4pbCUsA3416Qi6EQ9KGjcEFRgHOrOKnU6WAb9bGETYekKxCvjTag9E4pje54Dk5QP8bbMHYv%2FC3ueAeJkP0OGxB%2BJpBnArYR8EYQQnoN1ANFaBnPP5l8SrseYQL06Adk0FJY8HOWaBMleAHjh0hPosIzlo8v0A%2F34ZiOeHra0qKRPMVSI7tv%2B92tw%2FvhxUeBRq4VELgM7fBqK5GpRmoQLXNpubTu6zoNRpgT8nPQbq84wd%2FICuvyxiKHqiNAfI3wM6uIhBqGkLiiwAOsKDqOht7Itr9Vy8SjRBEWfyAbr%2FhR1BfpVQFdHJB%2FB2hh7x7j6QpwCVeeYQ2krUB5Clcj6A2m0gWj%2BD0mL49zW5cQyCHLN7rjlmmatEyXX%2FCrTzA%2FoQxZkWl9GJTCVo%2ByTj87%2B4giPKcv0qIHo4AV4D0VZrrQI34pnpRM65xue%2FzAreE4%2FT%2FSoglfEByMsiQtATlL3RAJ5YHrSx6ZDfS70s7uMHhBpR%2FYB5s0PW6oERp1b6%2FfrRhK3SDL5Tie6OQUHQlQ3sVDu%2BzPck9vWE9str%2B6IjS9gHmWPahaDJ%2BwCK6NIBBXsHB9HykXsxwDphlCmAdvplabUJNnZPB94%2FNt6xOe8XzEbP2WhM3WAg1Gub6tH%2B3Q1Pg376R9q4uqlno6gdHGjDOQ90eb01AHM6rYiuUJ1Oq4r4FVuj5vR9BzM9WgNvOywDhiIYQFvgbcfwAfwMvHcaPgBPA%2FDyHGjPbN9A8amebcdwAdD5Nf375txqewNUReoyvwBIXYLdQpWlhwFWqtPaCPD3AsFuASV6qqqIlb0JvkVC1FL9WkLUUlUWK3zXZLFC%2B1%2FBroFto6OsXIuEYJP4DzzW2YFV1oJaAAAAAElFTkSuQmCC\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>UpdatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/69a9af3a522af63dd3756126e8ee9aeb695f966c74ce28e3e97bed780daf5b54/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f7761676f6f646d616e2f646976653f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/wagoodman/dive?display_timestamp=committer&amp;logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=UpdatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>CreatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/577a2b29e1cfa3b4ec11ab5082165bb627cc37a6dc488204ef8cd8c88c649149/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f7761676f6f646d616e2f646976653f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/wagoodman/dive?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=CreatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<a href=\"https://github.com/opsre/awesome-ops\">\n</a><p dir=\"auto\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b964a36ea4078c39f603d46a29436371c7541a2f26e0228d7b21b9d9805b43d3/68747470733a2f2f736f6369616c6966792e6769742e63692f6f707372652f617765736f6d652d6f70732f696d6167653f6465736372697074696f6e3d3126666f6e743d42697474657226666f726b733d31266973737565733d31266c616e67756167653d31266c6f676f3d6874747073253341253246253246617661746172732e67697468756275736572636f6e74656e742e636f6d25324675253246313838353638303230266e616d653d31266f776e65723d31267061747465726e3d436972637569742b426f6172642670756c6c733d31267374617267617a6572733d31267468656d653d4c69676874\" alt=\"\" data-canonical-src=\"https://socialify.git.ci/opsre/awesome-ops/image?description=1&amp;font=Bitter&amp;forks=1&amp;issues=1&amp;language=1&amp;logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F188568020&amp;name=1&amp;owner=1&amp;pattern=Circuit+Board&amp;pulls=1&amp;stargazers=1&amp;theme=Light\" style=\"max-width: 100%;\"></a></p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a>\n</div>\n<h1 dir=\"auto\">dive</h1>\n<p dir=\"auto\"><a href=\"https://github.com/wagoodman/dive/releases/latest\"><img src=\"https://camo.githubusercontent.com/afd878cdbec7f1ffa85de47ecfbac94b56df05a5bfb5d64dd2458e6b49d09664/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f7761676f6f646d616e2f646976652e737667\" alt=\"GitHub release\" data-canonical-src=\"https://img.shields.io/github/release/wagoodman/dive.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/wagoodman/dive/actions/workflows/validations.yaml\"><img src=\"https://github.com/wagoodman/dive/actions/workflows/validations.yaml/badge.svg\" alt=\"Validations\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://goreportcard.com/report/github.com/wagoodman/dive\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/df57033a91a41297aa27a9e64eed8d0d73e4254612efee7c61259c0aaa5de724/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f7761676f6f646d616e2f64697665\" alt=\"Go Report Card\" data-canonical-src=\"https://goreportcard.com/badge/github.com/wagoodman/dive\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://github.com/wagoodman/dive/blob/main/LICENSE\"><img src=\"https://camo.githubusercontent.com/c8485a8dd4d73a4cc1a13fd4bf5277b3928ce5c4d73dfb77266ccd209c10e40c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d4954253230322e302d626c75652e737667\" alt=\"License: MIT\" data-canonical-src=\"https://img.shields.io/badge/License-MIT%202.0-blue.svg\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://www.paypal.me/wagoodman\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/3b6f0241351d258d3a2a047b95eedd423d5d9365c06fa6ede9273326d0366945/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f6e6174652d50617950616c2d677265656e2e7376673f7374796c653d666c6174\" alt=\"Donate\" data-canonical-src=\"https://img.shields.io/badge/Donate-PayPal-green.svg?style=flat\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\"><strong>A tool for exploring a Docker image, layer contents, and discovering ways to shrink the size of your Docker/OCI image.</strong></p>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\".data/demo.gif\"><img src=\".data/demo.gif\" alt=\"Image\" data-animated-image=\"\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\">To analyze a Docker image simply run dive with an image tag/id/digest:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dive &lt;your-image-tag&gt;\"><pre class=\"notranslate\">dive <span class=\"pl-k\">&lt;</span>your-image-tag<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\">or you can dive with Docker directly:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"alias dive=&quot;docker run -ti --rm  -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive&quot;\ndive &lt;your-image-tag&gt;\n\n# for example\ndive nginx:latest\"><pre class=\"notranslate\"><code class=\"notranslate\">alias dive=\"docker run -ti --rm  -v /var/run/docker.sock:/var/run/docker.sock docker.io/wagoodman/dive\"\ndive &lt;your-image-tag&gt;\n\n# for example\ndive nginx:latest\n</code></pre></div>\n<p dir=\"auto\">or if you want to build your image then jump straight into analyzing it:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dive build -t &lt;some-tag&gt; .\"><pre class=\"notranslate\">dive build -t <span class=\"pl-k\">&lt;</span>some-tag<span class=\"pl-k\">&gt;</span> <span class=\"pl-c1\">.</span></pre></div>\n<p dir=\"auto\">Building on macOS (supporting only the Docker container engine):</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run --rm -it \\\n      -v /var/run/docker.sock:/var/run/docker.sock \\\n      -v  &quot;$(pwd)&quot;:&quot;$(pwd)&quot; \\\n      -w &quot;$(pwd)&quot; \\\n      -v &quot;$HOME/.dive.yaml&quot;:&quot;$HOME/.dive.yaml&quot; \\\n      docker.io/wagoodman/dive:latest build -t &lt;some-tag&gt; .\"><pre class=\"notranslate\">docker run --rm -it \\\n      -v /var/run/docker.sock:/var/run/docker.sock \\\n      -v  <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span>:<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> \\\n      -w <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-s\"><span class=\"pl-pds\">$(</span>pwd<span class=\"pl-pds\">)</span></span><span class=\"pl-pds\">\"</span></span> \\\n      -v <span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-smi\">$HOME</span>/.dive.yaml<span class=\"pl-pds\">\"</span></span>:<span class=\"pl-s\"><span class=\"pl-pds\">\"</span><span class=\"pl-smi\">$HOME</span>/.dive.yaml<span class=\"pl-pds\">\"</span></span> \\\n      docker.io/wagoodman/dive:latest build -t <span class=\"pl-k\">&lt;</span>some-tag<span class=\"pl-k\">&gt;</span> <span class=\"pl-c1\">.</span></pre></div>\n<p dir=\"auto\">Additionally you can run this in your CI pipeline to ensure you're keeping wasted space to a minimum (this skips the UI):</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"CI=true dive &lt;your-image&gt;\"><pre class=\"notranslate\"><code class=\"notranslate\">CI=true dive &lt;your-image&gt;\n</code></pre></div>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\".data/demo-ci.png\"><img src=\".data/demo-ci.png\" alt=\"Image\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\"><strong>This is beta quality!</strong> <em>Feel free to submit an issue if you want a new feature or find a bug :)</em></p>\n<h2 dir=\"auto\">Basic Features</h2>\n<p dir=\"auto\"><strong>Show Docker image contents broken down by layer</strong></p>\n<p dir=\"auto\">As you select a layer on the left, you are shown the contents of that layer combined with all previous layers on the right. Also, you can fully explore the file tree with the arrow keys.</p>\n<p dir=\"auto\"><strong>Indicate what's changed in each layer</strong></p>\n<p dir=\"auto\">Files that have changed, been modified, added, or removed are indicated in the file tree. This can be adjusted to show changes for a specific layer, or aggregated changes up to this layer.</p>\n<p dir=\"auto\"><strong>Estimate \"image efficiency\"</strong></p>\n<p dir=\"auto\">The lower left pane shows basic layer info and an experimental metric that will guess how much wasted space your image contains. This might be from duplicating files across layers, moving files across layers, or not fully removing files. Both a percentage \"score\" and total wasted file space is provided.</p>\n<p dir=\"auto\"><strong>Quick build/analysis cycles</strong></p>\n<p dir=\"auto\">You can build a Docker image and do an immediate analysis with one command:<br>\n<code class=\"notranslate\">dive build -t some-tag .</code></p>\n<p dir=\"auto\">You only need to replace your <code class=\"notranslate\">docker build</code> command with the same <code class=\"notranslate\">dive build</code><br>\ncommand.</p>\n<p dir=\"auto\"><strong>CI Integration</strong></p>\n<p dir=\"auto\">Analyze an image and get a pass/fail result based on the image efficiency and wasted space. Simply set <code class=\"notranslate\">CI=true</code> in the environment when invoking any valid dive command.</p>\n<p dir=\"auto\"><strong>Multiple Image Sources and Container Engines Supported</strong></p>\n<p dir=\"auto\">With the <code class=\"notranslate\">--source</code> option, you can select where to fetch the container image from:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dive &lt;your-image&gt; --source &lt;source&gt;\"><pre class=\"notranslate\">dive <span class=\"pl-k\">&lt;</span>your-image<span class=\"pl-k\">&gt;</span> --source <span class=\"pl-k\">&lt;</span>source<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\">or</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dive &lt;source&gt;://&lt;your-image&gt;\"><pre class=\"notranslate\">dive <span class=\"pl-k\">&lt;</span>source<span class=\"pl-k\">&gt;</span>://<span class=\"pl-k\">&lt;</span>your-image<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\">With valid <code class=\"notranslate\">source</code> options as such:</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">docker</code>: Docker engine (the default option)</li>\n<li><code class=\"notranslate\">docker-archive</code>: A Docker Tar Archive from disk</li>\n<li><code class=\"notranslate\">podman</code>: Podman engine (linux only)</li>\n</ul>\n<h2 dir=\"auto\">Installation</h2>\n<p dir=\"auto\"><strong>Ubuntu/Debian</strong></p>\n<p dir=\"auto\">Using debs:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"DIVE_VERSION=$(curl -sL &quot;https://api.github.com/repos/wagoodman/dive/releases/latest&quot; | grep '&quot;tag_name&quot;:' | sed -E 's/.*&quot;v([^&quot;]+)&quot;.*/\\1/')\ncurl -fOL &quot;https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb&quot;\nsudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb\"><pre class=\"notranslate\">DIVE_VERSION=<span class=\"pl-s\"><span class=\"pl-pds\">$(</span>curl -sL <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://api.github.com/repos/wagoodman/dive/releases/latest<span class=\"pl-pds\">\"</span></span> <span class=\"pl-k\">|</span> grep <span class=\"pl-s\"><span class=\"pl-pds\">'</span>\"tag_name\":<span class=\"pl-pds\">'</span></span> <span class=\"pl-k\">|</span> sed -E <span class=\"pl-s\"><span class=\"pl-pds\">'</span>s/.*\"v([^\"]+)\".*/\\1/<span class=\"pl-pds\">'</span></span><span class=\"pl-pds\">)</span></span>\ncurl -fOL <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://github.com/wagoodman/dive/releases/download/v<span class=\"pl-smi\">${DIVE_VERSION}</span>/dive_<span class=\"pl-smi\">${DIVE_VERSION}</span>_linux_amd64.deb<span class=\"pl-pds\">\"</span></span>\nsudo apt install ./dive_<span class=\"pl-smi\">${DIVE_VERSION}</span>_linux_amd64.deb</pre></div>\n<p dir=\"auto\">Using snap:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo snap install docker\nsudo snap install dive\nsudo snap connect dive:docker-executables docker:docker-executables\nsudo snap connect dive:docker-daemon docker:docker-daemon\"><pre class=\"notranslate\">sudo snap install docker\nsudo snap install dive\nsudo snap connect dive:docker-executables docker:docker-executables\nsudo snap connect dive:docker-daemon docker:docker-daemon</pre></div>\n<div class=\"markdown-alert markdown-alert-caution\" dir=\"auto\"><p class=\"markdown-alert-title\" dir=\"auto\"><svg class=\"octicon octicon-stop mr-2\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M4.47.22A.749.749 0 0 1 5 0h6c.199 0 .389.079.53.22l4.25 4.25c.141.14.22.331.22.53v6a.749.749 0 0 1-.22.53l-4.25 4.25A.749.749 0 0 1 11 16H5a.749.749 0 0 1-.53-.22L.22 11.53A.749.749 0 0 1 0 11V5c0-.199.079-.389.22-.53Zm.84 1.28L1.5 5.31v5.38l3.81 3.81h5.38l3.81-3.81V5.31L10.69 1.5ZM8 4a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 4Zm0 8a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Caution</p><p dir=\"auto\">The Snap method is not recommended if you installed Docker via <code class=\"notranslate\">apt-get</code>, since it might break your existing Docker daemon.</p>\n<p dir=\"auto\">See also: <a class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"2459027901\" data-permission-text=\"Title is private\" data-url=\"https://github.com/wagoodman/dive/issues/546\" data-hovercard-type=\"issue\" data-hovercard-url=\"/wagoodman/dive/issues/546/hovercard\" href=\"https://github.com/wagoodman/dive/issues/546\">wagoodman/dive#546</a></p>\n</div>\n<p dir=\"auto\"><strong>RHEL/Centos</strong></p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"DIVE_VERSION=$(curl -sL &quot;https://api.github.com/repos/wagoodman/dive/releases/latest&quot; | grep '&quot;tag_name&quot;:' | sed -E 's/.*&quot;v([^&quot;]+)&quot;.*/\\1/')\ncurl -fOL &quot;https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.rpm&quot;\nrpm -i dive_${DIVE_VERSION}_linux_amd64.rpm\"><pre class=\"notranslate\">DIVE_VERSION=<span class=\"pl-s\"><span class=\"pl-pds\">$(</span>curl -sL <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://api.github.com/repos/wagoodman/dive/releases/latest<span class=\"pl-pds\">\"</span></span> <span class=\"pl-k\">|</span> grep <span class=\"pl-s\"><span class=\"pl-pds\">'</span>\"tag_name\":<span class=\"pl-pds\">'</span></span> <span class=\"pl-k\">|</span> sed -E <span class=\"pl-s\"><span class=\"pl-pds\">'</span>s/.*\"v([^\"]+)\".*/\\1/<span class=\"pl-pds\">'</span></span><span class=\"pl-pds\">)</span></span>\ncurl -fOL <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://github.com/wagoodman/dive/releases/download/v<span class=\"pl-smi\">${DIVE_VERSION}</span>/dive_<span class=\"pl-smi\">${DIVE_VERSION}</span>_linux_amd64.rpm<span class=\"pl-pds\">\"</span></span>\nrpm -i dive_<span class=\"pl-smi\">${DIVE_VERSION}</span>_linux_amd64.rpm</pre></div>\n<p dir=\"auto\"><strong>Arch Linux</strong></p>\n<p dir=\"auto\">Available in the <a href=\"https://archlinux.org/packages/extra/x86_64/dive/\" rel=\"nofollow\">extra repository</a> and can be installed via <a href=\"https://wiki.archlinux.org/title/Pacman\" rel=\"nofollow\">pacman</a>:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pacman -S dive\"><pre class=\"notranslate\">pacman -S dive</pre></div>\n<p dir=\"auto\"><strong>Mac</strong></p>\n<p dir=\"auto\">If you use <a href=\"https://brew.sh\" rel=\"nofollow\">Homebrew</a>:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"brew install dive\"><pre class=\"notranslate\">brew install dive</pre></div>\n<p dir=\"auto\">If you use <a href=\"https://www.macports.org\" rel=\"nofollow\">MacPorts</a>:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo port install dive\"><pre class=\"notranslate\">sudo port install dive</pre></div>\n<p dir=\"auto\">Or download the latest Darwin build from the <a href=\"https://github.com/wagoodman/dive/releases/latest\">releases page</a>.</p>\n<p dir=\"auto\"><strong>Windows</strong></p>\n<p dir=\"auto\">If you use <a href=\"https://chocolatey.org\" rel=\"nofollow\">Chocolatey</a></p>\n<div class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"choco install dive\"><pre class=\"notranslate\">choco install dive</pre></div>\n<p dir=\"auto\">If you use <a href=\"https://scoop.sh/\" rel=\"nofollow\">scoop</a></p>\n<div class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"scoop install main/dive\"><pre class=\"notranslate\">scoop install main<span class=\"pl-k\">/</span>dive</pre></div>\n<p dir=\"auto\">If you use <a href=\"https://learn.microsoft.com/en-gb/windows/package-manager/\" rel=\"nofollow\">winget</a>:</p>\n<div class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"winget install --id wagoodman.dive\"><pre class=\"notranslate\">winget install <span class=\"pl-k\">--</span>id wagoodman.dive</pre></div>\n<p dir=\"auto\">Or download the latest Windows build from the <a href=\"https://github.com/wagoodman/dive/releases/latest\">releases page</a>.</p>\n<p dir=\"auto\"><strong>Go tools</strong><br>\nRequires Go version 1.10 or higher.</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"go install github.com/wagoodman/dive@latest\"><pre class=\"notranslate\">go install github.com/wagoodman/dive@latest</pre></div>\n<p dir=\"auto\"><em>Note</em>: installing in this way you will not see a proper version when running <code class=\"notranslate\">dive -v</code>.</p>\n<p dir=\"auto\"><strong>Nix/NixOS</strong></p>\n<p dir=\"auto\">On NixOS:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nix-env -iA nixos.dive\"><pre class=\"notranslate\">nix-env -iA nixos.dive</pre></div>\n<p dir=\"auto\">On non-NixOS (Linux, Mac)</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"nix-env -iA nixpkgs.dive\"><pre class=\"notranslate\">nix-env -iA nixpkgs.dive</pre></div>\n<p dir=\"auto\"><strong>X-CMD</strong></p>\n<p dir=\"auto\"><a href=\"https://www.x-cmd.com/\" rel=\"nofollow\">x-cmd</a> is a <strong>toolbox for Posix Shell</strong>, offering a lightweight package manager built using shell and awk.</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"x env use dive\"><pre class=\"notranslate\">x env use dive</pre></div>\n<p dir=\"auto\"><strong>Docker</strong></p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker pull docker.io/wagoodman/dive\n# or alternatively\ndocker pull ghcr.io/wagoodman/dive\"><pre class=\"notranslate\">docker pull docker.io/wagoodman/dive\n<span class=\"pl-c\"><span class=\"pl-c\">#</span> or alternatively</span>\ndocker pull ghcr.io/wagoodman/dive</pre></div>\n<p dir=\"auto\">When running you'll need to include the Docker socket file:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run --rm -it \\\n    -v /var/run/docker.sock:/var/run/docker.sock \\\n    docker.io/wagoodman/dive:latest &lt;dive arguments...&gt;\"><pre class=\"notranslate\">docker run --rm -it \\\n    -v /var/run/docker.sock:/var/run/docker.sock \\\n    docker.io/wagoodman/dive:latest <span class=\"pl-k\">&lt;</span>dive arguments...<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\">Docker for Windows (showing PowerShell compatible line breaks; collapse to a single line for Command Prompt compatibility)</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run --rm -it `\n    -v /var/run/docker.sock:/var/run/docker.sock `\n    docker.io/wagoodman/dive:latest &lt;dive arguments...&gt;\"><pre class=\"notranslate\">docker run --rm -it <span class=\"pl-s\"><span class=\"pl-pds\">`</span></span>\n<span class=\"pl-s\">    -v /var/run/docker.sock:/var/run/docker.sock <span class=\"pl-pds\">`</span></span>\n    docker.io/wagoodman/dive:latest <span class=\"pl-k\">&lt;</span>dive arguments...<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\"><strong>Note:</strong> depending on the version of docker you are running locally you may need to specify the docker API version as an environment variable:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"   DOCKER_API_VERSION=1.37 dive ...\"><pre class=\"notranslate\">   DOCKER_API_VERSION=1.37 dive ...</pre></div>\n<p dir=\"auto\">or if you are running with a docker image:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"docker run --rm -it \\\n    -v /var/run/docker.sock:/var/run/docker.sock \\\n    -e DOCKER_API_VERSION=1.37 \\\n    docker.io/wagoodman/dive:latest &lt;dive arguments...&gt;\"><pre class=\"notranslate\">docker run --rm -it \\\n    -v /var/run/docker.sock:/var/run/docker.sock \\\n    -e DOCKER_API_VERSION=1.37 \\\n    docker.io/wagoodman/dive:latest <span class=\"pl-k\">&lt;</span>dive arguments...<span class=\"pl-k\">&gt;</span></pre></div>\n<p dir=\"auto\">if you are using an alternative runtime (Colima etc) then you may need to specify the docker host as an environment variable in order to pull local images:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"   export DOCKER_HOST=$(docker context inspect -f '{{ .Endpoints.docker.Host }}')\"><pre class=\"notranslate\">   <span class=\"pl-k\">export</span> DOCKER_HOST=<span class=\"pl-s\"><span class=\"pl-pds\">$(</span>docker context inspect -f <span class=\"pl-s\"><span class=\"pl-pds\">'</span>{{ .Endpoints.docker.Host }}<span class=\"pl-pds\">'</span></span><span class=\"pl-pds\">)</span></span></pre></div>\n<h2 dir=\"auto\">CI Integration</h2>\n<p dir=\"auto\">When running dive with the environment variable <code class=\"notranslate\">CI=true</code> then the dive UI will be bypassed and will instead analyze your docker image, giving it a pass/fail indication via return code. Currently there are three metrics supported via a <code class=\"notranslate\">.dive-ci</code> file that you can put at the root of your repo:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"rules:\n  # If the efficiency is measured below X%, mark as failed.\n  # Expressed as a ratio between 0-1.\n  lowestEfficiency: 0.95\n\n  # If the amount of wasted space is at least X or larger than X, mark as failed.\n  # Expressed in B, KB, MB, and GB.\n  highestWastedBytes: 20MB\n\n  # If the amount of wasted space makes up for X% or more of the image, mark as failed.\n  # Note: the base image layer is NOT included in the total image size.\n  # Expressed as a ratio between 0-1; fails if the threshold is met or crossed.\n  highestUserWastedPercent: 0.20\"><pre class=\"notranslate\"><code class=\"notranslate\">rules:\n  # If the efficiency is measured below X%, mark as failed.\n  # Expressed as a ratio between 0-1.\n  lowestEfficiency: 0.95\n\n  # If the amount of wasted space is at least X or larger than X, mark as failed.\n  # Expressed in B, KB, MB, and GB.\n  highestWastedBytes: 20MB\n\n  # If the amount of wasted space makes up for X% or more of the image, mark as failed.\n  # Note: the base image layer is NOT included in the total image size.\n  # Expressed as a ratio between 0-1; fails if the threshold is met or crossed.\n  highestUserWastedPercent: 0.20\n</code></pre></div>\n<p dir=\"auto\">You can override the CI config path with the <code class=\"notranslate\">--ci-config</code> option.</p>\n<h2 dir=\"auto\">KeyBindings</h2>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th>Key Binding</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><kbd>Ctrl + C</kbd> or <kbd>Q</kbd></td>\n<td>Exit</td>\n</tr>\n<tr>\n<td><kbd>Tab</kbd></td>\n<td>Switch between the layer and filetree views</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + F</kbd></td>\n<td>Filter files</td>\n</tr>\n<tr>\n<td><kbd>ESC</kbd></td>\n<td>Close filter files</td>\n</tr>\n<tr>\n<td><kbd>PageUp</kbd> or <kbd>U</kbd></td>\n<td>Scroll up a page</td>\n</tr>\n<tr>\n<td><kbd>PageDown</kbd> or <kbd>D</kbd></td>\n<td>Scroll down a page</td>\n</tr>\n<tr>\n<td><kbd>Up</kbd> or <kbd>K</kbd></td>\n<td>Move up one line within a page</td>\n</tr>\n<tr>\n<td><kbd>Down</kbd> or <kbd>J</kbd></td>\n<td>Move down one line within a page</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + A</kbd></td>\n<td>Layer view: see aggregated image modifications</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + L</kbd></td>\n<td>Layer view: see current layer modifications</td>\n</tr>\n<tr>\n<td><kbd>Space</kbd></td>\n<td>Filetree view: collapse/uncollapse a directory</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + Space</kbd></td>\n<td>Filetree view: collapse/uncollapse all directories</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + A</kbd></td>\n<td>Filetree view: show/hide added files</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + R</kbd></td>\n<td>Filetree view: show/hide removed files</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + M</kbd></td>\n<td>Filetree view: show/hide modified files</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + U</kbd></td>\n<td>Filetree view: show/hide unmodified files</td>\n</tr>\n<tr>\n<td><kbd>Ctrl + B</kbd></td>\n<td>Filetree view: show/hide file attributes</td>\n</tr>\n<tr>\n<td><kbd>PageUp</kbd> or <kbd>U</kbd></td>\n<td>Filetree view: scroll up a page</td>\n</tr>\n<tr>\n<td><kbd>PageDown</kbd> or <kbd>D</kbd></td>\n<td>Filetree view: scroll down a page</td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<h2 dir=\"auto\">UI Configuration</h2>\n<p dir=\"auto\">No configuration is necessary, however, you can create a config file and override values:</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# supported options are &quot;docker&quot; and &quot;podman&quot;\ncontainer-engine: docker\n# continue with analysis even if there are errors parsing the image archive\nignore-errors: false\nlog:\n  enabled: true\n  path: ./dive.log\n  level: info\n\n# Note: you can specify multiple bindings by separating values with a comma.\n# Note: UI hinting is derived from the first binding\nkeybinding:\n  # Global bindings\n  quit: ctrl+c\n  toggle-view: tab\n  filter-files: ctrl+f, ctrl+slash\n  close-filter-files: esc\n  up: up,k\n  down: down,j\n  left: left,h\n  right: right,l\n\n  # Layer view specific bindings\n  compare-all: ctrl+a\n  compare-layer: ctrl+l\n\n  # File view specific bindings\n  toggle-collapse-dir: space\n  toggle-collapse-all-dir: ctrl+space\n  toggle-added-files: ctrl+a\n  toggle-removed-files: ctrl+r\n  toggle-modified-files: ctrl+m\n  toggle-unmodified-files: ctrl+u\n  toggle-filetree-attributes: ctrl+b\n  page-up: pgup,u\n  page-down: pgdn,d\n\ndiff:\n  # You can change the default files shown in the filetree (right pane). All diff types are shown by default.\n  hide:\n    - added\n    - removed\n    - modified\n    - unmodified\n\nfiletree:\n  # The default directory-collapse state\n  collapse-dir: false\n\n  # The percentage of screen width the filetree should take on the screen (must be &gt;0 and &lt;1)\n  pane-width: 0.5\n\n  # Show the file attributes next to the filetree\n  show-attributes: true\n\nlayer:\n  # Enable showing all changes from this layer and every previous layer\n  show-aggregated-changes: false\n\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span> supported options are \"docker\" and \"podman\"</span>\n<span class=\"pl-ent\">container-engine</span>: <span class=\"pl-s\">docker</span>\n<span class=\"pl-c\"><span class=\"pl-c\">#</span> continue with analysis even if there are errors parsing the image archive</span>\n<span class=\"pl-ent\">ignore-errors</span>: <span class=\"pl-c1\">false</span>\n<span class=\"pl-ent\">log</span>:\n  <span class=\"pl-ent\">enabled</span>: <span class=\"pl-c1\">true</span>\n  <span class=\"pl-ent\">path</span>: <span class=\"pl-s\">./dive.log</span>\n  <span class=\"pl-ent\">level</span>: <span class=\"pl-s\">info</span>\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span> Note: you can specify multiple bindings by separating values with a comma.</span>\n<span class=\"pl-c\"><span class=\"pl-c\">#</span> Note: UI hinting is derived from the first binding</span>\n<span class=\"pl-ent\">keybinding</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Global bindings</span>\n  <span class=\"pl-ent\">quit</span>: <span class=\"pl-s\">ctrl+c</span>\n  <span class=\"pl-ent\">toggle-view</span>: <span class=\"pl-s\">tab</span>\n  <span class=\"pl-ent\">filter-files</span>: <span class=\"pl-s\">ctrl+f, ctrl+slash</span>\n  <span class=\"pl-ent\">close-filter-files</span>: <span class=\"pl-s\">esc</span>\n  <span class=\"pl-ent\">up</span>: <span class=\"pl-s\">up,k</span>\n  <span class=\"pl-ent\">down</span>: <span class=\"pl-s\">down,j</span>\n  <span class=\"pl-ent\">left</span>: <span class=\"pl-s\">left,h</span>\n  <span class=\"pl-ent\">right</span>: <span class=\"pl-s\">right,l</span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Layer view specific bindings</span>\n  <span class=\"pl-ent\">compare-all</span>: <span class=\"pl-s\">ctrl+a</span>\n  <span class=\"pl-ent\">compare-layer</span>: <span class=\"pl-s\">ctrl+l</span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> File view specific bindings</span>\n  <span class=\"pl-ent\">toggle-collapse-dir</span>: <span class=\"pl-s\">space</span>\n  <span class=\"pl-ent\">toggle-collapse-all-dir</span>: <span class=\"pl-s\">ctrl+space</span>\n  <span class=\"pl-ent\">toggle-added-files</span>: <span class=\"pl-s\">ctrl+a</span>\n  <span class=\"pl-ent\">toggle-removed-files</span>: <span class=\"pl-s\">ctrl+r</span>\n  <span class=\"pl-ent\">toggle-modified-files</span>: <span class=\"pl-s\">ctrl+m</span>\n  <span class=\"pl-ent\">toggle-unmodified-files</span>: <span class=\"pl-s\">ctrl+u</span>\n  <span class=\"pl-ent\">toggle-filetree-attributes</span>: <span class=\"pl-s\">ctrl+b</span>\n  <span class=\"pl-ent\">page-up</span>: <span class=\"pl-s\">pgup,u</span>\n  <span class=\"pl-ent\">page-down</span>: <span class=\"pl-s\">pgdn,d</span>\n\n<span class=\"pl-ent\">diff</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> You can change the default files shown in the filetree (right pane). All diff types are shown by default.</span>\n  <span class=\"pl-ent\">hide</span>:\n    - <span class=\"pl-s\">added</span>\n    - <span class=\"pl-s\">removed</span>\n    - <span class=\"pl-s\">modified</span>\n    - <span class=\"pl-s\">unmodified</span>\n\n<span class=\"pl-ent\">filetree</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> The default directory-collapse state</span>\n  <span class=\"pl-ent\">collapse-dir</span>: <span class=\"pl-c1\">false</span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> The percentage of screen width the filetree should take on the screen (must be &gt;0 and &lt;1)</span>\n  <span class=\"pl-ent\">pane-width</span>: <span class=\"pl-c1\">0.5</span>\n\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Show the file attributes next to the filetree</span>\n  <span class=\"pl-ent\">show-attributes</span>: <span class=\"pl-c1\">true</span>\n\n<span class=\"pl-ent\">layer</span>:\n  <span class=\"pl-c\"><span class=\"pl-c\">#</span> Enable showing all changes from this layer and every previous layer</span>\n  <span class=\"pl-ent\">show-aggregated-changes</span>: <span class=\"pl-c1\">false</span>\n</pre></div>\n<p dir=\"auto\">dive will search for configs in the following locations:</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">$XDG_CONFIG_HOME/dive/*.yaml</code></li>\n<li><code class=\"notranslate\">$XDG_CONFIG_DIRS/dive/*.yaml</code></li>\n<li><code class=\"notranslate\">~/.config/dive/*.yaml</code></li>\n<li><code class=\"notranslate\">~/.dive.yaml</code></li>\n</ul>\n<p dir=\"auto\"><code class=\"notranslate\">.yml</code> can be used instead of <code class=\"notranslate\">.yaml</code> if desired.</p>","updatedAt":"2025-05-21T15:54:19Z","upvoteCount":null,"author":{"login":"eryajf","avatarUrl":"https://avatars.githubusercontent.com/u/33259379?u=e4a4090a38ac2473aaed4ef9945233636776c6c3&v=4","url":"https://github.com/eryajf"},"category":null,"labels":{"edges":[{"node":{"name":"更多","color":"25B472"}},{"node":{"name":"Docker-Tools","color":"abbcfb"}},{"node":{"name":"wagoodman","color":"3b3e70"}}]},"comments":{"edges":[]}}},"pageContext":{"number":114,"previous":{"title":"chenquan/diskusage: 💥 显示磁盘使用情况的工具（Linux、MacOS 和 Windows），是一个查找最大目录或文件的非常快速的工具","number":113},"next":{"title":"xxnuo/dns-benchmark: 一个批量 DNS 服务器基准测试工具，用于本地测量全世界的 DNS 服务器的可访问性和性能。","number":115}}},
    "staticQueryHashes": ["151096407","2861350382"]}