{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/120",
    "result": {"data":{"issuesJson":{"id":"a2188f0b-fb7a-55da-91c3-aca0fab7bf7f","title":"ufoscout/docker-compose-wait: 一个小型命令行工具，用于在使用 Docker-compose(or K8s)时等待其他 Docker 容器启动的场景","number":120,"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/ufoscout/docker-compose-wait\">ufoscout/docker-compose-wait</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/5cc6f67e487a5dbb4eb3c74619b99e54697e1a3ced38a82f571daf2266f026d2/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f75666f73636f75742f646f636b65722d636f6d706f73652d776169742e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/ufoscout/docker-compose-wait.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/9bc87196561e55987e215926e697307105eb0d9fae50fefc7e13358b2b8eae01/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f75666f73636f75742f646f636b65722d636f6d706f73652d776169743f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/ufoscout/docker-compose-wait?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/b9df7c9d117a216f45f8862b47852706ffcaed12d80a80cf7744622e96bce4ae/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f75666f73636f75742f646f636b65722d636f6d706f73652d776169743f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/ufoscout/docker-compose-wait?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/c7f9eba41b5782c712367bf8a80f74fccd0e33562dd11fb651a3b1d90c29d297/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f75666f73636f75742f646f636b65722d636f6d706f73652d776169743f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/ufoscout/docker-compose-wait?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/8adb9a57c1001181700a6e8b9e474ba57d3c11c684999606cb022cf9451fdbf2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f75666f73636f75742f646f636b65722d636f6d706f73652d776169743f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/ufoscout/docker-compose-wait?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/0f827887cee617e1d9a21c1e2788fed8b2d7149d1b22c64bf8dfdba969dc0fcf/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f75666f73636f75742f646f636b65722d636f6d706f73652d776169743f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/ufoscout/docker-compose-wait?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\">docker-compose-wait</h1>\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/ufoscout/docker-compose-wait/actions/workflows/build_and_test.yml/badge.svg\"><img src=\"https://github.com/ufoscout/docker-compose-wait/actions/workflows/build_and_test.yml/badge.svg\" alt=\"Build Status\" style=\"max-width: 100%;\"></a><br>\n<a href=\"https://codecov.io/gh/ufoscout/docker-compose-wait\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/0e95f803fb4616232576bd429f9bbcc24ca30506165f318bf1a30b87cba75064/68747470733a2f2f636f6465636f762e696f2f67682f75666f73636f75742f646f636b65722d636f6d706f73652d776169742f6272616e63682f6d61737465722f67726170682f62616467652e737667\" alt=\"codecov\" data-canonical-src=\"https://codecov.io/gh/ufoscout/docker-compose-wait/branch/master/graph/badge.svg\" style=\"max-width: 100%;\"></a></p>\n<p dir=\"auto\">A small command-line utility to wait for other docker images to be started while using docker-compose (or Kubernetes or docker stack or whatever).</p>\n<p dir=\"auto\">It permits waiting for:</p>\n<ul dir=\"auto\">\n<li>a fixed amount of seconds</li>\n<li>until a TCP port is open on a target image</li>\n<li>until a file or directory is present on the local filesystem</li>\n</ul>\n<h2 dir=\"auto\">Usage</h2>\n<p dir=\"auto\">This utility should be used in the docker build process and launched before your application starts.</p>\n<p dir=\"auto\">For example, your application \"MySuperApp\" uses MongoDB, Postgres and MySql (wow!) and you want to be sure that, when it starts, all other systems are available, then simply customize your dockerfile this way:</p>\n<div class=\"highlight highlight-source-dockerfile notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"## Use whatever base image\nFROM alpine\n\n## Add the wait script to the image\nCOPY --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait\n\n## Otherwise you can directly download the executable from github releases. E.g.:\n#  ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.11.0/wait /wait\n#  RUN chmod +x /wait\n\n## Add your application to the docker image\nADD MySuperApp.sh /MySuperApp.sh\n\n## Launch the wait tool and then your application\nCMD /wait &amp;&amp; /MySuperApp.sh\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span># Use whatever base image</span>\n<span class=\"pl-k\">FROM</span> alpine\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span># Add the wait script to the image</span>\n<span class=\"pl-k\">COPY</span> --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span># Otherwise you can directly download the executable from github releases. E.g.:</span>\n<span class=\"pl-c\"><span class=\"pl-c\">#</span>  ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.11.0/wait /wait</span>\n<span class=\"pl-c\"><span class=\"pl-c\">#</span>  RUN chmod +x /wait</span>\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span># Add your application to the docker image</span>\n<span class=\"pl-k\">ADD</span> MySuperApp.sh /MySuperApp.sh\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span># Launch the wait tool and then your application</span>\n<span class=\"pl-k\">CMD</span> /wait &amp;&amp; /MySuperApp.sh</pre></div>\n<p dir=\"auto\">Done! the image is ready.</p>\n<p dir=\"auto\">Now let's modify the docker-compose.yml file:</p>\n<div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"version: &quot;3&quot;\n\nservices:\n  mongo:\n    image: mongo:3.4\n    hostname: mongo\n    ports:\n      - &quot;27017:27017&quot;\n\n  postgres:\n    image: &quot;postgres:9.4&quot;\n    hostname: postgres\n    ports:\n      - &quot;5432:5432&quot;\n\n  mysql:\n    image: &quot;mysql:5.7&quot;\n    hostname: mysql\n    ports:\n      - &quot;3306:3306&quot;\n\n  mySuperApp:\n    image: &quot;mySuperApp:latest&quot;\n    hostname: mySuperApp\n    environment:\n      WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017\"><pre class=\"notranslate\"><span class=\"pl-ent\">version</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>3<span class=\"pl-pds\">\"</span></span>\n\n<span class=\"pl-ent\">services</span>:\n  <span class=\"pl-ent\">mongo</span>:\n    <span class=\"pl-ent\">image</span>: <span class=\"pl-s\">mongo:3.4</span>\n    <span class=\"pl-ent\">hostname</span>: <span class=\"pl-s\">mongo</span>\n    <span class=\"pl-ent\">ports</span>:\n      - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>27017:27017<span class=\"pl-pds\">\"</span></span>\n\n  <span class=\"pl-ent\">postgres</span>:\n    <span class=\"pl-ent\">image</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>postgres:9.4<span class=\"pl-pds\">\"</span></span>\n    <span class=\"pl-ent\">hostname</span>: <span class=\"pl-s\">postgres</span>\n    <span class=\"pl-ent\">ports</span>:\n      - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>5432:5432<span class=\"pl-pds\">\"</span></span>\n\n  <span class=\"pl-ent\">mysql</span>:\n    <span class=\"pl-ent\">image</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>mysql:5.7<span class=\"pl-pds\">\"</span></span>\n    <span class=\"pl-ent\">hostname</span>: <span class=\"pl-s\">mysql</span>\n    <span class=\"pl-ent\">ports</span>:\n      - <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>3306:3306<span class=\"pl-pds\">\"</span></span>\n\n  <span class=\"pl-ent\">mySuperApp</span>:\n    <span class=\"pl-ent\">image</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>mySuperApp:latest<span class=\"pl-pds\">\"</span></span>\n    <span class=\"pl-ent\">hostname</span>: <span class=\"pl-s\">mySuperApp</span>\n    <span class=\"pl-ent\">environment</span>:\n      <span class=\"pl-ent\">WAIT_HOSTS</span>: <span class=\"pl-s\">postgres:5432, mysql:3306, mongo:27017</span></pre></div>\n<p dir=\"auto\">When docker-compose is started (or Kubernetes or docker stack or whatever), your application will be started only when all the pairs host:port in the WAIT_HOSTS variable are available.<br>\nThe WAIT_HOSTS environment variable is not mandatory, if not declared, the script executes without waiting.</p>\n<p dir=\"auto\">If you want to use the script directly in docker-compose.yml instead of the Dockerfile, please note that the <code class=\"notranslate\">command:</code> configuration option is limited to a single command so you should wrap in a <code class=\"notranslate\">sh</code> call. For example:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"command: sh -c &quot;/wait &amp;&amp; /MySuperApp.sh&quot;\"><pre class=\"notranslate\">command: sh -c <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/wait &amp;&amp; /MySuperApp.sh<span class=\"pl-pds\">\"</span></span></pre></div>\n<p dir=\"auto\">This is discussed further <a href=\"https://stackoverflow.com/questions/30063907/using-docker-compose-how-to-execute-multiple-commands\" rel=\"nofollow\">here</a> and <a href=\"https://github.com/docker/compose/issues/2033\" data-hovercard-type=\"issue\" data-hovercard-url=\"/docker/compose/issues/2033/hovercard\">here</a>.</p>\n<h2 dir=\"auto\">Usage in images that do not have a shell</h2>\n<p dir=\"auto\">When using <a href=\"https://github.com/GoogleContainerTools/distroless\">distroless</a> or building images <a href=\"https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch\" rel=\"nofollow\"><code class=\"notranslate\">FROM scratch</code></a>, it is common to not have <code class=\"notranslate\">sh</code> available. In this case, it is necessary to <a href=\"#additional-configuration-options\">specify the command for wait to run explicitly</a>. The invoked command will be invoked with any arguments configured for it and will completely replace the <code class=\"notranslate\">wait</code> process in your container via a syscall to <a href=\"https://man7.org/linux/man-pages/man3/exec.3.html\" rel=\"nofollow\"><code class=\"notranslate\">exec</code></a>. Because there is no shell to expand arguments in this case, <code class=\"notranslate\">wait</code> must be the <code class=\"notranslate\">ENTRYPOINT</code> for the container and has to be specified in <a href=\"https://docs.docker.com/engine/reference/builder/#exec-form-entrypoint-example\" rel=\"nofollow\">the exec form</a>. Note that because there is no shell to perform expansion, arguments like <code class=\"notranslate\">*</code> must be interpreted by the program that receives them.</p>\n<div class=\"highlight highlight-source-dockerfile notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"FROM golang\n\nCOPY myApp /app\nWORKDIR /app\nRUN go build -o /myApp -ldflags '-s -w -extldflags -static' ./...\n\n## ----------------\n\nFROM scratch\n\nCOPY --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait\n\nCOPY --from=0 /myApp /myApp\nENV WAIT_COMMAND=&quot;/myApp arg1 argN...&quot;\nENTRYPOINT [&quot;/wait&quot;]\"><pre class=\"notranslate\"><span class=\"pl-k\">FROM</span> golang\n\n<span class=\"pl-k\">COPY</span> myApp /app\n<span class=\"pl-k\">WORKDIR</span> /app\n<span class=\"pl-k\">RUN</span> go build -o /myApp -ldflags <span class=\"pl-s\">'-s -w -extldflags -static'</span> ./...\n\n<span class=\"pl-c\"><span class=\"pl-c\">#</span># ----------------</span>\n\n<span class=\"pl-k\">FROM</span> scratch\n\n<span class=\"pl-k\">COPY</span> --from=ghcr.io/ufoscout/docker-compose-wait:latest /wait /wait\n\n<span class=\"pl-k\">COPY</span> --from=0 /myApp /myApp\n<span class=\"pl-k\">ENV</span> WAIT_COMMAND=<span class=\"pl-s\">\"/myApp arg1 argN...\"</span>\n<span class=\"pl-k\">ENTRYPOINT</span> [<span class=\"pl-s\">\"/wait\"</span>]</pre></div>\n<h2 dir=\"auto\">Additional configuration options</h2>\n<p dir=\"auto\">The behaviour of the wait utility can be configured with the following environment variables:</p>\n<ul dir=\"auto\">\n<li><em>WAIT_LOGGER_LEVEL</em> : the output logger level. Valid values are: <em>debug</em>, <em>info</em>, <em>error</em>, <em>off</em>. the default is <em>debug</em>.</li>\n<li><em>WAIT_HOSTS</em>: comma-separated list of pairs host:port for which you want to wait.</li>\n<li><em>WAIT_PATHS</em>: comma-separated list of paths (i.e. files or directories) on the local filesystem for which you want to wait until they exist.</li>\n<li><em>WAIT_COMMAND</em>: command and arguments to run once waiting completes. The invoked command will completely replace the <code class=\"notranslate\">wait</code> process. The default is none.</li>\n<li><em>WAIT_TIMEOUT</em>: max number of seconds to wait for all the hosts/paths to be available before failure. The default is 30 seconds.</li>\n<li><em>WAIT_HOST_CONNECT_TIMEOUT</em>: The timeout of a single TCP connection to a remote host before attempting a new connection. The default is 5 seconds.</li>\n<li><em>WAIT_BEFORE</em>: number of seconds to wait (sleep) before start checking for the hosts/paths availability</li>\n<li><em>WAIT_AFTER</em>: number of seconds to wait (sleep) once all the hosts/paths are available</li>\n<li><em>WAIT_SLEEP_INTERVAL</em>: number of seconds to sleep between retries. The default is 1 second.</li>\n</ul>\n<h2 dir=\"auto\">Supported architectures</h2>\n<p dir=\"auto\">From release 2.11.0, the following executables are available for download:</p>\n<ul dir=\"auto\">\n<li><em>wait</em>: This is the executable intended for Linux x64 systems</li>\n<li><em>wait_x86_64</em>: This is the very same executable than <em>wait</em></li>\n<li><em>wait_aarch64</em>: This is the executable to be used for aarch64 architectures</li>\n<li><em>wait_arm7</em>: This is the executable to be used for arm7 architectures</li>\n</ul>\n<p dir=\"auto\">All executables are built with <a href=\"https://www.musl-libc.org/\" rel=\"nofollow\">MUSL</a> for maximum portability.</p>\n<p dir=\"auto\">To use any of these executables, simply replace the executable name in the download link:<br>\n<a href=\"https://github.com/ufoscout/docker-compose-wait/releases/download/%7B%7BVERSION%7D%7D/%7B%7Bexecutable_name%7D%7D\">https://github.com/ufoscout/docker-compose-wait/releases/download/{{VERSION}}/{{executable_name}}</a></p>\n<h2 dir=\"auto\">Docker images</h2>\n<p dir=\"auto\">Official docker images based on <code class=\"notranslate\">scratch</code> can be found here:<br>\n<a href=\"https://github.com/users/ufoscout/packages/container/package/docker-compose-wait\">https://github.com/users/ufoscout/packages/container/package/docker-compose-wait</a></p>\n<h2 dir=\"auto\">Using on other systems</h2>\n<p dir=\"auto\">The simplest way of getting the <em>wait</em> executable is to download it from</p>\n<p dir=\"auto\"><a href=\"https://github.com/ufoscout/docker-compose-wait/releases/download/%7B%7BVERSION%7D%7D/wait\">https://github.com/ufoscout/docker-compose-wait/releases/download/{{VERSION}}/wait</a></p>\n<p dir=\"auto\">or to use one of the pre-built docker images.</p>\n<p dir=\"auto\">If you need it for an architecture for which a pre-built file is not available, you should clone this repository and build it for your target.</p>\n<p dir=\"auto\">As it has no external dependencies, an being written in the mighty <a href=\"https://www.rust-lang.org\" rel=\"nofollow\">rust</a><br>\nprogramming language, the build process is just a simple <code class=\"notranslate\">cargo build --release</code><br>\n(well... of course you need to install the rust compiler before...)</p>\n<p dir=\"auto\">For everything involving cross-compilation, you should take a look at <a href=\"https://github.com/rust-embedded/cross\">Cross</a>.</p>\n<p dir=\"auto\">For example, to build for a <strong>raspberry pi</strong>, everything you have to do is:</p>\n<ol dir=\"auto\">\n<li>Install the latest stable rust toolchain using rustup</li>\n<li>Correctly configure Docker on your machine</li>\n<li>Open a terminal and type:</li>\n</ol>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cargo install cross\ncross build --target=armv7-unknown-linux-musleabihf --release\"><pre class=\"notranslate\">cargo install cross\ncross build --target=armv7-unknown-linux-musleabihf --release</pre></div>\n<p dir=\"auto\">Use your shiny new executable on your raspberry device!</p>\n<h2 dir=\"auto\">Notes</h2>\n<p dir=\"auto\">This utility was explicitly written to be used with docker-compose; however, it can be used everywhere since it has no dependencies on docker.</p>","updatedAt":"2025-05-21T15:54:41Z","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":"ufoscout","color":"6bf8dc"}}]},"comments":{"edges":[]}}},"pageContext":{"number":120,"previous":{"title":"TechnitiumSoftware/DnsServer: Technitium DNS服务器是一个开源的权威递归DNS服务器，可用于自托管DNS服务器以保护隐私和安全","number":119},"next":{"title":"FX-Max/docker-install-everything: 使用 Docker-compose 安装各种服务","number":121}}},
    "staticQueryHashes": ["151096407","2861350382"]}