{"id":367305,"date":"2024-05-21T03:18:27","date_gmt":"2024-05-21T03:18:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=367305"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T03:18:27","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=367305","title":{"rendered":"<span>\u041a\u0430\u043a \u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 docker \u043d\u0430 40%<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90c\/d91\/be2\/90cd91be2e701afb31993a4d30346233.png\" width=\"640\" height=\"480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90c\/d91\/be2\/90cd91be2e701afb31993a4d30346233.png\"\/><\/figure>\n<p>\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u043f\u043e\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441\u00a0Dockerfile, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u00a0\u043d\u0438\u0445 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435. \u041d\u043e\u00a0\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0438\u0445 \u0432\u00a0\u0440\u0435\u0435\u0441\u0442\u0440\u0435 docker hub. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\" rel=\"noopener noreferrer nofollow\"><strong>ugit<\/strong>\u00a0\u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u043e\u0442\u043c\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434 git<\/a> (\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\u00a0\u0431\u044b \u043c\u043e\u0433\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0434\u0438, \u043d\u0435\u00a0\u043b\u044e\u0431\u044f\u0449\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438\u0437\u00a0\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430.<\/p>\n<p>\u0414\u0430\u2011\u0434\u0430, \u0437\u043d\u0430\u044e. \u041d\u0410\u0414\u041e \u041f\u0415\u0420\u0415\u041f\u0418\u0421\u0410\u0422\u042c \u0415\u0413\u041e \u041d\u0410\u00a0GO\/RUST\/\u0415\u0429\u0401 \u041a\u0410\u041a\u041e\u041c\u2011\u0422\u041e \u0412\u041e\u041b\u0428\u0415\u0411\u041d\u041e\u041c \u042f\u0417\u042b\u041a\u0415. \u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u043f\u044f\u0442\u0438\u0441\u043e\u0442 \u0441\u00a0\u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a Bash, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0435\u0433\u043e \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u00a0\u0441\u0442\u0440\u0430\u0445\u043e\u043c \u0441\u043c\u0435\u0440\u0442\u043d\u043e\u0439 \u043a\u0430\u0437\u043d\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u00a0ugit \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u0443\u00a0\u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043d\u0435\u00a0\u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e).<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u0442\u043e\u043c, \u043a\u0430\u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Dockerfile \u0434\u043b\u044f <a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\/blob\/master\/ugit\" rel=\"noopener noreferrer nofollow\"><strong>ugit (\u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u0430)<\/strong><\/a> \u0438 \u0441\u043d\u0438\u0437\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 <strong>40%<\/strong> (<em>\u0441 31,4\u00a0\u041c\u0411 \u0434\u043e 17,6\u00a0\u041c\u0411<\/em>), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u0437\u0430\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0448\u0435\u043b\u043b\u0430 \u0442\u043e\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u00a0\u0432\u0438\u0434\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 docker!<\/p>\n<blockquote>\n<p><em>P.S.: \u042f \u043d\u0435 DevOps \u0438 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e Docker, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 <\/em><a href=\"https:\/\/bhupesh.me\/about\/#-connect\" rel=\"noopener noreferrer nofollow\"><em>\u043c\u043d\u0435<\/em><\/a><em>. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 docker \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <\/em><a href=\"https:\/\/hub.docker.com\/r\/bhupeshimself\/ugit\" rel=\"noopener noreferrer nofollow\"><em>docker hub<\/em><\/a><\/p>\n<\/blockquote>\n<h3>\u0421\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Dockerfile<\/h3>\n<pre><code class=\"powershell\"># \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Alpine FROM alpine:3.18 # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \/app WORKDIR \/app # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 COPY . \/app # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 RUN apk add --no-cache      bash      gawk      findutils      coreutils      git      ncurses      fzf # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \u0422\u0430\u043a \u0438 \u0435\u0441\u0442\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 Dockerfile \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 ugit \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443,<\/p>\n<pre><code class=\"powershell\">docker build -t ugit . docker run --rm -it -v $(pwd):\/app ugit<\/code><\/pre>\n<p>ugit \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p><code>ugit<\/code>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>bash <\/code>(\u0432\u0435\u0440\u0441\u0438\u0438 4.0 \u0438 \u0432\u044b\u0448\u0435),\u00a0<code>awk<\/code>,\u00a0<code>xargs<\/code>,\u00a0<code>git<\/code>,\u00a0<code>fzf<\/code>,\u00a0<code>tput<\/code>,\u00a0<code>cut<\/code>,\u00a0<code>tr<\/code>,\u00a0<code>nl<\/code>.<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/www.gnu.org\/software\/findutils\/\" rel=\"noopener noreferrer nofollow\">findutils<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>xargs<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/wiki.debian.org\/coreutils\" rel=\"noopener noreferrer nofollow\">coreutils<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 <code>tr<\/code>,\u00a0<code>cut<\/code>\u00a0\u0438 <code>nl<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>ncurses<\/code>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f <code>tput<\/code>\u00a0(\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438\u043b\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <code>31,4 \u041c\u0411<\/code>. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0435\u0433\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c.<\/p>\n<h3>\u041f\u0443\u0442\u044c \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 \u043d\u0430 40%<\/h3>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0448\u0438\u0445 (\u043e\u0442\u0447\u0430\u044f\u043d\u043d\u044b\u0445) \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0438\u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0446\u0435\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>sleep<\/code>,\u00a0<code>watch<\/code>,\u00a0<code>du<\/code>\u00a0\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <code>ugit<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0432\u043d\u043e\u0441\u0438\u043c\u044b\u0445 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <code>ugit<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 alpine\u00a0\u043d\u0430 alpine<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443. \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u042f \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0431\u0440\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 <code>alpine<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b FROM alpine:3.18 as builder RUN apk add --no-cache      bash      gawk      findutils      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit  WORKDIR \/app COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM alpine COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/gawk \/usr\/bin\/ COPY --from=builder \/usr\/bin\/xargs \/usr\/bin COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0445 <code>20,6<\/code>\u00a0\u041c\u0411. \u041e\u0431\u0440\u0430\u0437 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u043d\u043e ugit \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442.<\/p>\n<pre><code>Error loading shared library libreadline.so.8: No such file or directory (needed by \/bin\/bash)<\/code><\/pre>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435.<\/p>\n<h4>\u041f\u043e\u0445\u043e\u0436\u0435, xargs\u00a0\u0438 awk\u00a0\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a?<\/h4>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 <code>xargs<\/code>, \u0438 <code>awk<\/code>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 Alpine. \u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"powershell\">docker run -it alpine \/bin\/sh -c \"awk --help\" docker run -it alpine \/bin\/sh -c \"xargs --help\"<\/code><\/pre>\n<p>\u0414\u0435\u0442\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0431\u0435\u0440\u0451\u043c <code>gawk<\/code>\u00a0\u0438 <code>findutils<\/code>\u00a0\u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e <code>Dockerfile<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 FROM alpine:3.18 as builder RUN apk add --no-cache      bash      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit WORKDIR \/app COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM alpine:3.18 COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043d\u0438\u0437\u0438\u043b\u0441\u044f \u0434\u043e <code>20 \u041c\u0411<\/code>. \u041c\u044b \u0443\u0436\u0435 \u0431\u043b\u0438\u0437\u043a\u043e, \u043d\u043e ugit \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435 scratch<\/h3>\n<p>\u042d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u043d\u0435 \u043f\u0440\u043e\u0431\u0443\u0435\u0442. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0443\u0433\u0430\u044e\u0449\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0442\u0432\u0430\u0433\u0438. \u042f \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u0443\u0433\u0430\u043d, \u043f\u043e\u0439\u0434\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0437 docker SCRATCH \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412 \u043d\u0435\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u044b\u0442\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 SCRATCH, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/hub.docker.com\/_\/scratch\" rel=\"noopener noreferrer nofollow\">\u0435\u0433\u043e README \u043d\u0430 docker hub<\/a>.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0432\u0441\u0451 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0421\u043a\u0440\u0435\u0441\u0442\u0438\u043c \u043f\u0430\u043b\u044c\u0446\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c <code>alpine<\/code>\u00a0\u043d\u0430 <code>scratch<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 FROM alpine:3.18 as builder RUN apk add --no-cache      bash      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM scratch COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0434\u043e <code>12,4 \u041c\u0411<\/code>. \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 60%? \u041c\u044b \u0447\u0442\u043e, \u043e\u0431\u043c\u0430\u043d\u0443\u043b\u0438 \u0441\u0430\u043c\u0438 \u0441\u0435\u0431\u044f? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c ugit.<\/p>\n<pre><code class=\"powershell\">$ docker run --rm -it -v $(pwd):\/app ugit-a3 exec \/usr\/bin\/ugit: no such file or directory $ docker run --rm -it --entrypoint \/bin\/bash ugit-a4 exec \/bin\/bash: no such file or directory<\/code><\/pre>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043c\u044b \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b bash, \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<h4>\u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h4>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u0430\u043a <code>git<\/code>,\u00a0<code>tput<\/code>,\u00a0<code>bash<\/code>; \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u041e\u0431\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u044d\u0442\u043e \u0444\u0430\u0439\u043b\u044b <code>.so<\/code>\u00a0(<code>.dll<\/code> \u0432 Windows, <code>.dylib<\/code> OS X).\u00a0<a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/ldd.1.html\" rel=\"noopener noreferrer nofollow\"><strong>ldd<\/strong><\/a>\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041e\u043d \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c <code>ldd \/bin\/bash<\/code>\u00a0\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Alpine, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"powershell\">\/ # ldd \/bin\/ls \/lib\/ld-musl-aarch64.so.1 (0xffff8c9c0000) libc.musl-aarch64.so.1 => \/lib\/ld-musl-aarch64.so.1 (0xffff8c9c0000) \/ # ldd \/bin\/bash \/lib\/ld-musl-aarch64.so.1 (0xffffb905a000) libreadline.so.8 => \/usr\/lib\/libreadline.so.8 (0xffffb8f06000) libc.musl-aarch64.so.1 => \/lib\/ld-musl-aarch64.so.1 (0xffffb905a000) libncursesw.so.6 => \/usr\/lib\/libncursesw.so.6 (0xffffb8e95000)<\/code><\/pre>\n<h3>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438<\/h3>\n<ul>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c <em>soname<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u0435\u0437 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438. \u041e\u043d\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>lib<\/code>, \u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 <code>.so<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>libpcre2-8.so.0<\/code>\u00a0\u0438\u043c\u0435\u0435\u0442 soname\u00a0<code>libpcre2-8.so<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>\/usr\/lib\/libpcre2-8.so.0<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>libpcre2-8.so.0.3.6<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u041d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u044d\u0442\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u00a0<code>=><\/code>\u00a0\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0441 <code>libc<\/code> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 C \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u00abexec \/bin\/bash: no such file or directory\u00bb? \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0451 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 C \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0446\u0438\u0442\u0430\u0442\u0430 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/twitter.com\/dcreager\/\" rel=\"noopener noreferrer nofollow\">\u0414\u0443\u0433\u043b\u0430\u0441\u0430 \u041a\u0440\u0438\u0433\u0435\u0440\u0430<\/a>\u00a0\u043e <a href=\"https:\/\/dcreager.net\/2017\/10\/shared-library-versions\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043e\u0431\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<blockquote>\n<p><em>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u0432 Linux-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e <\/em><code>\/usr\/lib<\/code><em>). \u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u044d\u0442\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043e\u0431\u0449\u0443\u044e \u0443\u0436\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/em><\/p>\n<p><em>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 Linux \u0441\u043d\u0438\u0436\u0430\u044e\u0442 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044f <\/em><strong><em>\u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/em><\/strong><em>\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a; \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434. \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u043a\u043e\u043f\u0438\u044e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e) \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0435 \u0435\u0451 \u0432 \u043e\u0431\u0449\u0435\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435; \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044d\u0442\u0430\u043f\u043e\u0432 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0438 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443).<\/em><\/p>\n<\/blockquote>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0445\u043e\u0436\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0435\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit.<\/p>\n<blockquote>\n<p><em>\u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u0438\u0434\u0430 <\/em><code>for cmd in \/bin\/; do echo $cmd; ldd $cmd; done<\/code><\/p>\n<\/blockquote>\n<pre><code class=\"powershell\"># \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a COPY --from=ugit-ops \/usr\/lib\/libncursesw.so.6 \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libncursesw.so.6.4 \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libpcre \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libreadline* \/usr\/lib\/ COPY --from=ugit-ops \/lib\/libacl.so.1 \/lib\/ COPY --from=ugit-ops \/lib\/libattr.so.1 \/lib\/ COPY --from=ugit-ops \/lib\/libc.musl-* \/lib\/ COPY --from=ugit-ops \/lib\/ld-musl-* \/lib\/ COPY --from=ugit-ops \/lib\/libutmps.so.0.1 \/lib\/ COPY --from=ugit-ops \/lib\/libskarnet.so.2.13 \/lib\/ COPY --from=ugit-ops \/lib\/libz.so.1 \/lib\/<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 <code>libc.musl-<\/code><em>\u00a0\u0438\u00a0<\/em><code>ld-musl-<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0430 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043c\u0430\u0448\u0438\u043d\u044b-\u0445\u043e\u0441\u0442\u0430.<\/p>\n<h4>\u0428\u0435\u0431\u0430\u043d\u0433\u0438 #!\u00a0\u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u0443\u044e <a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\/blob\/master\/ugit#L1\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 ugit<\/a>, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0448\u0435\u0431\u0430\u043d\u0433 <code>#!\/usr\/bin\/env bash<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>env<\/code>\u00a0\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0448\u0435\u043b\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430; \u044d\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. Linux (\u0438 \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 macOS) \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 <code>sh<\/code>,\u00a0<code>bash<\/code>, \u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 <code>zsh<\/code>\u00a0\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0435\u0431\u0430\u043d\u0433\u043e\u0432 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043c\u044b \u0443\u0436\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>bash<\/code>, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0433\u043e. \u042d\u0442\u043e \u0435\u0449\u0451 \u0438 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043d\u0430\u043c \u043f\u0430\u0440\u0443 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0430. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e\u0447\u0442\u0438 1,9 \u041c\u0411.<\/p>\n<pre><code class=\"powershell\"># \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"\/bin\/bash\", \"\/bin\/ugit\"] # or  # ENTRYPOINT [\"\/bin\/bash\", \"\/bin\/ugit\"]<\/code><\/pre>\n<h4>\u0418\u0437\u0443\u0447\u0438\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 terminfo<\/h4>\n<p>\u0412 ugit \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f <code>tput<\/code> \u0435\u0441\u0442\u044c \u0446\u0432\u0435\u0442\u0430. \u041c\u044b \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u00ab\u0433\u043e\u043b\u044b\u0439\u00bb \u043e\u0431\u0440\u0430\u0437 Alpine \u0441 <code>bash<\/code>\u00a0\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <code>\/etc\/terminfo<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430.<\/p>\n<pre><code class=\"powershell\">37a1a77f70ed:\/app# cd \/etc\/terminfo\/ 37a1a77f70ed:\/etc\/terminfo# ls a  d  g  k  l  p  r  st  v  x<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0445 \u00ab\u043f\u0430\u043f\u043e\u043a\u00bb \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f <code>$TERM<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>xterm<\/code>\u00a0\u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 <code>tput -T xterm colors<\/code>, \u0442\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c \u0446\u0432\u0435\u0442\u043e\u0432. \u0414\u043b\u044f <code>xterm<\/code>\u00a0\u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0432\u043d\u044f\u0442\u044c\u0441\u044f <code>8<\/code>, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <code>xterm-256color<\/code>\u00a0\u2014 <code>256<\/code>.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0448\u0430\u043d\u0441 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441\u043e\u0440\u043e\u043a\u0430, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <code>terminfo<\/code>. \u041e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f. \u042d\u0442\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043d\u0430\u043c \u0435\u0449\u0451 97 \u041a\u0411 \u2014 \u043c\u0435\u043b\u043e\u0447\u044c, \u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u043a\u0438 \u0431\u0435\u0441\u043f\u043e\u0440\u044f\u0434\u043a\u0430.<\/p>\n<pre><code class=\"powershell\"># \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 terminfo \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f xterm-256color COPY --from=ugit-ops \/etc\/terminfo\/x\/xterm-256color \/usr\/share\/terminfo\/x\/ # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0446\u0432\u0435\u0442\u0430 ENV TERM=xterm-256color<\/code><\/pre>\n<h3>\u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit<\/h3>\n<p>\u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 Docker \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 17,6 \u041c\u0411 \u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043e\u0442\u0447\u0451\u0442\u043e\u043c <a href=\"https:\/\/docs.docker.com\/scout\/\" rel=\"noopener noreferrer nofollow\">docker scout<\/a> \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438). \u041c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u043d\u0430 40%.<\/p>\n<p>\u0412\u043e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Dockerfile:<\/p>\n<pre><code class=\"powershell\">FROM alpine:3.18 as ugit-ops RUN apk add --no-cache      bash      coreutils      git      ncurses      curl # \u0421\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b fzf \u0441 GitHub, \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u0438 0.46.0, ugit \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0443\u043c 0.21.0 RUN curl -L -o fzf.tar.gz https:\/\/github.com\/junegunn\/fzf\/releases\/download\/0.46.0\/fzf-0.46.0-linux_amd64.tar.gz &amp;&amp;      tar -xzf fzf.tar.gz &amp;&amp;      mv fzf \/usr\/bin\/ # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit  COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM scratch COPY --from=ugit-ops \/usr\/bin\/ugit \/bin\/ COPY --from=ugit-ops \/usr\/bin\/git \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/tput \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/nl \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/awk \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/xargs \/usr\/bin\/ COPY --from=ugit-ops \/usr\/bin\/cut \/usr\/bin\/cut COPY --from=ugit-ops \/usr\/bin\/tr \/usr\/bin\/tr COPY --from=ugit-ops \/bin\/bash \/bin\/ COPY --from=ugit-ops \/bin\/sh \/bin\/ # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a COPY --from=ugit-ops \/usr\/lib\/libncursesw.so.6 \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libncursesw.so.6.4 \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libpcre* \/usr\/lib\/ COPY --from=ugit-ops \/usr\/lib\/libreadline* \/usr\/lib\/ COPY --from=ugit-ops \/lib\/libacl.so.1 \/lib\/ COPY --from=ugit-ops \/lib\/libattr.so.1 \/lib\/ COPY --from=ugit-ops \/lib\/libc.musl-* \/lib\/ COPY --from=ugit-ops \/lib\/ld-musl-* \/lib\/ COPY --from=ugit-ops \/lib\/libutmps.so.0.1 \/lib\/ COPY --from=ugit-ops \/lib\/libskarnet.so.2.13 \/lib\/ COPY --from=ugit-ops \/lib\/libz.so.1 \/lib\/ # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 terminfo COPY --from=ugit-ops \/etc\/terminfo\/x\/xterm-256color \/usr\/share\/terminfo\/x\/ # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0446\u0432\u0435\u0442\u0430 ENV TERM=xterm-256color WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"\/bin\/bash\", \"\/bin\/ugit\"]<\/code><\/pre>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 <code>fzf<\/code>\u00a0<code>0.46.0<\/code>\u00a0(\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c <code>0.21.0<\/code>, \u0438 \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b: \u043a\u0430\u043a\u043e\u0433\u043e \u0447\u0451\u0440\u0442\u0430, \u0434\u0430\u0432\u0430\u0439 \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c\u0441\u044f \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<blockquote>\n<p>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 ugit \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439\u00a0<code>docker run --rm -it -v $(pwd):\/app ugit<\/code>. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043f\u0430\u043f\u043a\u0430 \u2014 \u044d\u0442\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 git.<\/p>\n<\/blockquote>\n<p>\u0412\u043e\u0442, \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<pre><code>Permission     UID:GID       Size  Filetree drwxr-xr-x         0:0        0 B  \u251c\u2500\u2500 app drwxr-xr-x         0:0     886 kB  \u251c\u2500\u2500 bin -rwxr-xr-x         0:0     866 kB  \u2502   \u251c\u2500\u2500 bash -rwxr-xr-x         0:0      21 kB  \u2502   \u2514\u2500\u2500 ugit drwxr-xr-x         0:0     1.9 MB  \u251c\u2500\u2500 lib -rwxr-xr-x         0:0     658 kB  \u2502   \u251c\u2500\u2500 ld-musl-aarch64.so.1 -rwxr-xr-x         0:0      67 kB  \u2502   \u251c\u2500\u2500 libacl.so.1 -rwxr-xr-x         0:0      67 kB  \u2502   \u251c\u2500\u2500 libattr.so.1 -rwxr-xr-x         0:0     658 kB  \u2502   \u251c\u2500\u2500 libc.musl-aarch64.so.1 -rwxr-xr-x         0:0     265 kB  \u2502   \u251c\u2500\u2500 libskarnet.so.2.13 -rwxr-xr-x         0:0      67 kB  \u2502   \u251c\u2500\u2500 libutmps.so.0.1 -rwxr-xr-x         0:0     133 kB  \u2502   \u2514\u2500\u2500 libz.so.1 drwxr-xr-x         0:0      15 MB  \u2514\u2500\u2500 usr drwxr-xr-x         0:0      12 MB      \u251c\u2500\u2500 bin -rwxr-xr-x         0:0     919 kB      \u2502   \u251c\u2500\u2500 awk -rwxr-xr-x         0:0     1.2 MB      \u2502   \u251c\u2500\u2500 cut -rwxr-xr-x      502:20     3.6 MB      \u2502   \u251c\u2500\u2500 fzf -rwxr-xr-x         0:0     3.0 MB      \u2502   \u251c\u2500\u2500 git -rwxr-xr-x         0:0     1.2 MB      \u2502   \u251c\u2500\u2500 nl -rwxr-xr-x         0:0      67 kB      \u2502   \u251c\u2500\u2500 tput -rwxr-xr-x         0:0     1.2 MB      \u2502   \u251c\u2500\u2500 tr -rwxr-xr-x         0:0     919 kB      \u2502   \u2514\u2500\u2500 xargs drwxr-xr-x         0:0     2.8 MB      \u251c\u2500\u2500 lib -rwxr-xr-x         0:0     396 kB      \u2502   \u251c\u2500\u2500 libncursesw.so.6 -rwxr-xr-x         0:0     396 kB      \u2502   \u251c\u2500\u2500 libncursesw.so.6.4 -rwxr-xr-x         0:0     592 kB      \u2502   \u251c\u2500\u2500 libpcre2-8.so.0 -rwxr-xr-x         0:0     592 kB      \u2502   \u251c\u2500\u2500 libpcre2-8.so.0.11.2 -rwxr-xr-x         0:0      67 kB      \u2502   \u251c\u2500\u2500 libpcre2-posix.so.3 -rwxr-xr-x         0:0      67 kB      \u2502   \u251c\u2500\u2500 libpcre2-posix.so.3.0.4 -rwxr-xr-x         0:0     351 kB      \u2502   \u251c\u2500\u2500 libreadline.so.8 -rwxr-xr-x         0:0     351 kB      \u2502   \u2514\u2500\u2500 libreadline.so.8.2 drwxr-xr-x         0:0     4.0 kB      \u2514\u2500\u2500 share drwxr-xr-x         0:0     4.0 kB          \u2514\u2500\u2500 terminfo drwxr-xr-x         0:0     4.0 kB              \u2514\u2500\u2500 x -rw-r--r--         0:0     4.0 kB                  \u2514\u2500\u2500 xterm-256color<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0448\u0435\u043b\u043b\u0430.<\/p>\n<blockquote>\n<p><em>P.S.: \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 docker \u0441\u043d\u0438\u0437\u0438\u043b\u0441\u044f \u0434\u043e 16,2 \u041c\u0411. \u041e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 Dockerfile\u00a0\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <\/em><a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\/blob\/master\/Dockerfile\" rel=\"noopener noreferrer nofollow\"><em>\u0437\u0434\u0435\u0441\u044c<\/em><\/a><em>. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u044f \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0440\u0430\u0432\u043d\u044b\u043c 17,6 \u041c\u0411.<\/em><\/p>\n<\/blockquote>\n<h3>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0435\u0449\u0451 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440?<\/h3>\n<p>\u0414\u0430, \u043d\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435:<\/p>\n<h4>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 1: \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 fzf?<\/h4>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f ugit \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <code>fzf<\/code>\u00a0\u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 <code>0.20.0<\/code>. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f. \u0422\u0430\u043a \u0447\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438? \u041d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 fzf, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Golang. \u041a\u0430\u043a \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 <code>docker scout quickview<\/code>, \u0441\u0442\u0430\u0440\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Golang \u0438\u043c\u0435\u0435\u0442 66 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e. \u041c\u043e\u0436\u0435\u0442, \u043e\u043d\u0438 \u043f\u043e\u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0437, \u043c\u043e\u0436\u0435\u0442, \u0438 \u043d\u0435\u0442. \u041d\u043e \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0442\u0430\u043a \u0440\u0438\u0441\u043a\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0440\u0435\u043c\u043b\u044e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b5e\/c2e\/c76\/b5ec2ec7687f6b0f3cb603ebf81d2db3.png\" alt=\"security issues in golang\" title=\"\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u0432 Golang\" width=\"1754\" height=\"712\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b5e\/c2e\/c76\/b5ec2ec7687f6b0f3cb603ebf81d2db3.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u0432 Golang<\/figcaption><\/div>\n<\/figure>\n<blockquote>\n<p><em>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 Alpine \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043a \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/em><\/p>\n<\/blockquote>\n<h4>\u041f\u0440\u0438\u0447\u0438\u043d\u0430 2: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 bash?<\/h4>\n<p>\u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f ugit \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <code>bash<\/code>\u00a0\u0432\u0435\u0440\u0441\u0438\u0438 <code>4.0<\/code>. \u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u043f\u0435\u0440\u0435\u0448\u0451\u043b \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e bash, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 5.0, \u0442\u043e \u0438 tr, \u0438 cut \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c. \u041d\u043e \u044d\u0442\u043e, \u0434\u0440\u0443\u0437\u044c\u044f \u043c\u043e\u0438, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u043d\u0430\u0440\u0443\u0448\u0430\u044e\u0449\u0435\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0418\u0437\u0431\u0430\u0432\u0438\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u043d\u0438\u0445, \u044f \u0431\u044b \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043b \u043f\u0430\u0440\u0443 \u0431\u0430\u0439\u0442\u043e\u0432, \u043d\u043e \u044f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441 bash 4.0. \u041f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439, \u043d\u0430 \u043c\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c bash.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b docker-slim?<\/h3>\n<ul>\n<li>\n<p>\u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b \u043e\u0431\u0440\u0430\u0437, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u043b\u043e \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438. Slim \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u0435\u0449\u044c, \u0432\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0441 ugit \u0437\u0430 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0430 \u043d\u0435 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u044b \u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b docker-squash?<\/h3>\n<p>\u042f \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b, \u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e\u0439. \u0412\u043e\u0442 \u043b\u043e\u0433 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 squash, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 Linux (AMD) (\u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430; \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f):<\/p>\n<pre><code>2024-01-26 19:53:30,292 root         INFO     docker-squash version 1.1.0, Docker 20.10.22, API 1.41... 2024-01-26 19:53:30,293 root         INFO     Using v2 image format 2024-01-26 19:53:30,310 root         INFO     Old image has 30 layers 2024-01-26 19:53:30,310 root         INFO     Checking if squashing is necessary... 2024-01-26 19:53:30,310 root         INFO     Attempting to squash last 30 layers... 2024-01-26 19:53:30,310 root         INFO     Saving image sha256:1b9107b09dec50bd8134a935ad58ef07deb7dc2a639804abc2cb3d47c1e74206 to \/tmp\/docker-squash-20kl1kbx\/old directory... 2024-01-26 19:53:30,536 root         INFO     Image saved! 2024-01-26 19:53:30,537 root         INFO     Squashing image 'ugit:latest'... 2024-01-26 19:53:30,538 root         INFO     Starting squashing... 2024-01-26 19:53:30,538 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/3b03ba6aad8ab3b95e5ae7c173b5fe8980a4bb2b57e6e3c78d4c851e62befacd\/layer.tar'... 2024-01-26 19:53:30,539 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/af8614dc670d37bc2b4ee235fba1fba32f79cc665e1685d17bc09103206add88\/layer.tar'... 2024-01-26 19:53:30,541 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/fdfcf6e294b868ac5c9bb79f479da7365f074a24932d35cf88e6ee87313be39f\/layer.tar'... 2024-01-26 19:53:30,542 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/fea7bea22fc0e61f8b3bb33795946844efca8e6e2ece2d4cfb5d9d5dc50fa29c\/layer.tar'... 2024-01-26 19:53:30,543 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/c6b22f335e663d959cf9ecb676d297de3b818c608c10811f857fbd0950d39126\/layer.tar'... 2024-01-26 19:53:30,543 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/482d23995758cbffbedc338a3be0325106fc6172a7c54d23a22e8a1d585d2b9e\/layer.tar'... 2024-01-26 19:53:30,545 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/3b9a86d49326da225c5b1c85e01764d210c15bec579c5af34f0fc171127f5b5f\/layer.tar'... 2024-01-26 19:53:30,546 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/0ca82f27b278a4c9bb0bfe1ff3f38716051fb4849374eec8925f48efe436009b\/layer.tar'... 2024-01-26 19:53:30,546 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/3cca8b35bff33c3f212c956b4c71dd419bd86c146ec38afdcdd5a0288d1659b6\/layer.tar'... 2024-01-26 19:53:30,547 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/81dfb23402548ba22dff2162d2c4291d16e3553a3fc47b761d21013316571a82\/layer.tar'... 2024-01-26 19:53:30,548 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/273d7b9c894ca049315a77ce845423f819ee684544f171eaf6b8689c77f6ad05\/layer.tar'... 2024-01-26 19:53:30,550 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/27be6a1ed5a8507dc43bd30cb56ddddc9c0c9d52b6806eec8037f1fa09395552\/layer.tar'... 2024-01-26 19:53:30,551 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/d5f577b8ef6ec1875b1d986ca79da0339c1d228cc31bce4d42988556135c5909\/layer.tar'... 2024-01-26 19:53:30,551 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/f292c627dcee37256b008f33c3bc91c65463e7b8a6758306c130f53d80b045e5\/layer.tar'... 2024-01-26 19:53:30,553 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/41a4f2afaf2abd9098d62d9b4d5c6ee88c2d9478f48be9c8f407a81c7b207d6e\/layer.tar'... 2024-01-26 19:53:30,555 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/5dc1b8c25faa63c58a7905850043c14c59dced4746d7d34453edad7b86956849\/layer.tar'... 2024-01-26 19:53:30,557 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/f91a2a9df95e299850a3c512d292167e12f7df86dfc6a598279d35db4d804b7d\/layer.tar'... 2024-01-26 19:53:30,560 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/72447920860e9e88f3680623d2ac1d10f78111f16c3563b43009852d704d7515\/layer.tar'... 2024-01-26 19:53:30,563 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/cc9b36b470edfc560a35e67fa7d3adbcf3fe91acfaf82cd484080418a1168c7f\/layer.tar'... 2024-01-26 19:53:30,566 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/05a8e77bfb6dd759bacb2ba9c1505bc66979885591d623d83ce58cbe0047a539\/layer.tar'... 2024-01-26 19:53:30,568 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/a3452a5b414ce5be1c02a8d88374419f8de637552486ca47d6d810adc351386e\/layer.tar'... 2024-01-26 19:53:30,570 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/38af27767b34ce2676958ed305d78508fe745597b548d65b4a5532481ffd3296\/layer.tar'... 2024-01-26 19:53:30,570 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/c2e188390cb6b51470e879b62e2686add024114bcb76eb163053382cb424928a\/layer.tar'... 2024-01-26 19:53:30,574 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/d03cc62007f0fa8d1c09d0f34f5e74e0e6f65f48c9a53177b189c57f47be8074\/layer.tar'... 2024-01-26 19:53:30,578 root         INFO     Squashing file '\/tmp\/docker-squash-20kl1kbx\/old\/fa90033ac9d3c9085ba57fc406aed549a0dc14823c8f63f6358c9557b8f0a9ea\/layer.tar'... 2024-01-26 19:53:30,578 root         INFO     Squashing finished! 2024-01-26 19:53:30,608 root         INFO     Original image size: 17.34 MB 2024-01-26 19:53:30,608 root         INFO     Squashed image size: 17.29 MB 2024-01-26 19:53:30,608 root         INFO     Image size decreased by 0.32 % 2024-01-26 19:53:30,608 root         INFO     New squashed image ID is 2c697df9cb2d9fd5f4534e6358d68f1e1a04bb5b6d27087f894dbf492964b791 2024-01-26 19:53:30,741 root         INFO     Image registered in Docker daemon as ugit-squashed:squashed 2024-01-26 19:53:30,746 root         INFO     Done<\/code><\/pre>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<ul>\n<li>\n<p>Linux \u2014 \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412\u0441\u0451 \u0432 \u043d\u0451\u043c, \u043a\u0430\u0436\u0434\u043e\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u044d\u0442\u043e \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u043e\u0439\u0442\u0435\u0441\u044c \u0437\u0430\u043b\u0435\u0437\u0430\u0442\u044c \u0432 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u0438 \u043d\u043e\u0440\u044b \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u0432\u044b \u043c\u043d\u043e\u0433\u043e\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u0442\u0435\u0441\u044c. \u0412\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435, \u0447\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h3>\n<ul>\n<li>\n<p>\u041e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c <code>ldd<\/code> \u0438 \u0432\u0441\u0435\u043c \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432 <code>docker<\/code>\u00a0\u0438\u00a0<code>alpine<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e \u0440\u0435\u0431\u044f\u0442 \u0438\u0437 \u0434\u0438\u0441\u043a\u043e\u0440\u0434\u0430 <strong>developersIndia<\/strong>\u00a0\u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u043e\u0432\u0435\u0442\u0430\u043c\u0438 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443 <a href=\"https:\/\/github.com\/wagoodman\/dive\" rel=\"noopener noreferrer nofollow\">dive<\/a>\u00a0\u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0451\u0432 \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0420\u0435\u0441\u0443\u0440\u0441\u044b<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/tldp.org\/HOWTO\/Program-Library-HOWTO\/shared-libraries.html\" rel=\"noopener noreferrer nofollow\">TLDP.org \u2014 \u043e\u0431\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.docker.com\/develop\/develop-images\/dockerfile_best-practices\/\" rel=\"noopener noreferrer nofollow\">\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 Dockerfile<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/docs.docker.com\/storage\/storagedriver\/\" rel=\"noopener noreferrer nofollow\">\u041e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 docker<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/staex.io\/blog\/how-to-reduce-docker-image-size\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 Docker \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 IoT<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/791426\/\"> https:\/\/habr.com\/ru\/articles\/791426\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u043f\u043e\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u044f \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0441\u044c \u0441\u00a0Dockerfile, \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u00a0\u043d\u0438\u0445 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435. \u041d\u043e\u00a0\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0438\u0445 \u0432\u00a0\u0440\u0435\u0435\u0441\u0442\u0440\u0435 docker hub. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\" rel=\"noopener noreferrer nofollow\"><strong>ugit<\/strong>\u00a0\u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u043e\u0442\u043c\u0435\u043d\u044b \u043a\u043e\u043c\u0430\u043d\u0434 git<\/a> (\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u0430), \u043a\u043e\u0442\u043e\u0440\u044b\u0439\u00a0\u0431\u044b \u043c\u043e\u0433\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0434\u0438, \u043d\u0435\u00a0\u043b\u044e\u0431\u044f\u0449\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438\u0437\u00a0\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430.<\/p>\n<p>\u0414\u0430\u2011\u0434\u0430, \u0437\u043d\u0430\u044e. \u041d\u0410\u0414\u041e \u041f\u0415\u0420\u0415\u041f\u0418\u0421\u0410\u0422\u042c \u0415\u0413\u041e \u041d\u0410\u00a0GO\/RUST\/\u0415\u0429\u0401 \u041a\u0410\u041a\u041e\u041c\u2011\u0422\u041e \u0412\u041e\u041b\u0428\u0415\u0411\u041d\u041e\u041c \u042f\u0417\u042b\u041a\u0415. \u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u043f\u044f\u0442\u0438\u0441\u043e\u0442 \u0441\u00a0\u043b\u0438\u0448\u043d\u0438\u043c \u0441\u0442\u0440\u043e\u043a Bash, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0443 \u0435\u0433\u043e \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u00a0\u0441\u0442\u0440\u0430\u0445\u043e\u043c \u0441\u043c\u0435\u0440\u0442\u043d\u043e\u0439 \u043a\u0430\u0437\u043d\u0438. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u00a0ugit \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u043d\u0443\u00a0\u043b\u0438\u0448\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u0430\u043d\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043d\u0435\u00a0\u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e).<\/p>\n<p>\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u0442\u043e\u043c, \u043a\u0430\u043a\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Dockerfile \u0434\u043b\u044f <a href=\"https:\/\/github.com\/Bhupesh-V\/ugit\/blob\/master\/ugit\" rel=\"noopener noreferrer nofollow\"><strong>ugit (\u0448\u0435\u043b\u043b\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u0430)<\/strong><\/a> \u0438 \u0441\u043d\u0438\u0437\u0438\u043b \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 <strong>40%<\/strong> (<em>\u0441 31,4\u00a0\u041c\u0411 \u0434\u043e 17,6\u00a0\u041c\u0411<\/em>), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043f\u043e\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u043e \u0437\u0430\u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0448\u0435\u043b\u043b\u0430 \u0442\u043e\u0436\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u00a0\u0432\u0438\u0434\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 docker!<\/p>\n<blockquote>\n<p><em>P.S.: \u042f \u043d\u0435 DevOps \u0438 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u043f\u043e Docker, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 <\/em><a href=\"https:\/\/bhupesh.me\/about\/#-connect\" rel=\"noopener noreferrer nofollow\"><em>\u043c\u043d\u0435<\/em><\/a><em>. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 docker \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <\/em><a href=\"https:\/\/hub.docker.com\/r\/bhupeshimself\/ugit\" rel=\"noopener noreferrer nofollow\"><em>docker hub<\/em><\/a><\/p>\n<\/blockquote>\n<h3>\u0421\u0430\u043c\u0430\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Dockerfile<\/h3>\n<pre><code class=\"powershell\"># \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f Alpine FROM alpine:3.18 # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \/app WORKDIR \/app # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 COPY . \/app # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 RUN apk add --no-cache      bash      gawk      findutils      coreutils      git      ncurses      fzf # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \u0422\u0430\u043a \u0438 \u0435\u0441\u0442\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 Dockerfile \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 ugit \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0430\u043f\u043a\u0443,<\/p>\n<pre><code class=\"powershell\">docker build -t ugit . docker run --rm -it -v $(pwd):\/app ugit<\/code><\/pre>\n<p>ugit \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p><code>ugit<\/code>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>bash <\/code>(\u0432\u0435\u0440\u0441\u0438\u0438 4.0 \u0438 \u0432\u044b\u0448\u0435),\u00a0<code>awk<\/code>,\u00a0<code>xargs<\/code>,\u00a0<code>git<\/code>,\u00a0<code>fzf<\/code>,\u00a0<code>tput<\/code>,\u00a0<code>cut<\/code>,\u00a0<code>tr<\/code>,\u00a0<code>nl<\/code>.<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/www.gnu.org\/software\/findutils\/\" rel=\"noopener noreferrer nofollow\">findutils<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>xargs<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c <a href=\"https:\/\/wiki.debian.org\/coreutils\" rel=\"noopener noreferrer nofollow\">coreutils<\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 <code>tr<\/code>,\u00a0<code>cut<\/code>\u00a0\u0438 <code>nl<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>ncurses<\/code>\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f <code>tput<\/code>\u00a0(\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430).<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441 UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438\u043b\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 <code>31,4 \u041c\u0411<\/code>. \u041d\u0435\u043f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0435\u0433\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c.<\/p>\n<h3>\u041f\u0443\u0442\u044c \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0430 \u043d\u0430 40%<\/h3>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0448\u0438\u0445 (\u043e\u0442\u0447\u0430\u044f\u043d\u043d\u044b\u0445) \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439 \u043d\u0438\u0436\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0446\u0435\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0431\u0440\u0430\u0437\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 <code>sleep<\/code>,\u00a0<code>watch<\/code>,\u00a0<code>du<\/code>\u00a0\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <code>ugit<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0432\u043d\u043e\u0441\u0438\u043c\u044b\u0445 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 <code>ugit<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<h3>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 alpine\u00a0\u043d\u0430 alpine<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443. \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u042f \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u0431\u0440\u0430\u043b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 <code>alpine<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b FROM alpine:3.18 as builder RUN apk add --no-cache      bash      gawk      findutils      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit  WORKDIR \/app COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM alpine COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/gawk \/usr\/bin\/ COPY --from=builder \/usr\/bin\/xargs \/usr\/bin COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043e \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u044f\u044e\u0449\u0438\u0445 <code>20,6<\/code>\u00a0\u041c\u0411. \u041e\u0431\u0440\u0430\u0437 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f, \u043d\u043e ugit \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442.<\/p>\n<pre><code>Error loading shared library libreadline.so.8: No such file or directory (needed by \/bin\/bash)<\/code><\/pre>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0435.<\/p>\n<h4>\u041f\u043e\u0445\u043e\u0436\u0435, xargs\u00a0\u0438 awk\u00a0\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a?<\/h4>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 <code>xargs<\/code>, \u0438 <code>awk<\/code>\u00a0\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 Alpine. \u0412 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"powershell\">docker run -it alpine \/bin\/sh -c \"awk --help\" docker run -it alpine \/bin\/sh -c \"xargs --help\"<\/code><\/pre>\n<p>\u0414\u0435\u0442\u0441\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0443\u0431\u0435\u0440\u0451\u043c <code>gawk<\/code>\u00a0\u0438 <code>findutils<\/code>\u00a0\u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e <code>Dockerfile<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 FROM alpine:3.18 as builder RUN apk add --no-cache      bash      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit WORKDIR \/app COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM alpine:3.18 COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043d\u0438\u0437\u0438\u043b\u0441\u044f \u0434\u043e <code>20 \u041c\u0411<\/code>. \u041c\u044b \u0443\u0436\u0435 \u0431\u043b\u0438\u0437\u043a\u043e, \u043d\u043e ugit \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u0430\u043f\u0435 scratch<\/h3>\n<p>\u042d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u043d\u0435 \u043f\u0440\u043e\u0431\u0443\u0435\u0442. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0443\u0433\u0430\u044e\u0449\u0435 \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0442\u0432\u0430\u0433\u0438. \u042f \u0442\u043e\u0436\u0435 \u0431\u044b\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u0443\u0433\u0430\u043d, \u043f\u043e\u0439\u0434\u044f \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u0438.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0437 docker SCRATCH \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0443\u0441\u0442\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412 \u043d\u0435\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u044b\u0442\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 SCRATCH, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/hub.docker.com\/_\/scratch\" rel=\"noopener noreferrer nofollow\">\u0435\u0433\u043e README \u043d\u0430 docker hub<\/a>.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0442\u0430\u043a \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u0432\u0441\u0451 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0421\u043a\u0440\u0435\u0441\u0442\u0438\u043c \u043f\u0430\u043b\u044c\u0446\u044b \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u043c <code>alpine<\/code>\u00a0\u043d\u0430 <code>scratch<\/code>.<\/p>\n<pre><code class=\"powershell\"># \u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 FROM alpine:3.18 as builder RUN apk add --no-cache      bash      coreutils      git      ncurses      fzf # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \/app \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442 ugit COPY ugit . # \u0417\u0430\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u043e \u043f\u0443\u0442\u0438 RUN chmod +x ugit &amp;&amp; mv ugit \/usr\/local\/bin\/ # \u0412\u0442\u043e\u0440\u043e\u0439 \u044d\u0442\u0430\u043f: \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 FROM scratch COPY --from=builder \/usr\/local\/bin\/ugit \/usr\/bin\/ COPY --from=builder \/usr\/bin\/git \/usr\/bin\/ COPY --from=builder \/usr\/bin\/fzf \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tput \/usr\/bin\/ COPY --from=builder \/usr\/bin\/cut \/usr\/bin\/ COPY --from=builder \/usr\/bin\/tr \/usr\/bin\/ COPY --from=builder \/usr\/bin\/nl \/usr\/bin\/ COPY --from=builder \/usr\/bin\/env \/bin\/ COPY --from=builder \/bin\/bash \/bin\/ WORKDIR \/app # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c ugit \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 CMD [\"ugit\"]<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0434\u043e <code>12,4 \u041c\u0411<\/code>. \u0423\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 60%? \u041c\u044b \u0447\u0442\u043e, \u043e\u0431\u043c\u0430\u043d\u0443\u043b\u0438 \u0441\u0430\u043c\u0438 \u0441\u0435\u0431\u044f? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c ugit.<\/p>\n<pre><code class=\"powershell\">$ docker run --rm -it -v $(pwd):\/app ugit-a3 exec \/usr\/bin\/ugit: no such file or directory $ docker run --rm -it --entrypoint \/bin\/bash ugit-a4 exec \/bin\/bash: no such file or directory<\/code><\/pre>\n<p>\u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043c\u044b \u0441\u043b\u043e\u043c\u0430\u043b\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b bash, \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<h4>\u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h4>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0442\u0440\u0430\u043d\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u043a\u0430\u043a <code>git<\/code>,\u00a0<code>tput<\/code>,\u00a0<code>bash<\/code>; \u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u0449\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438. \u041e\u0431\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u2014 \u044d\u0442\u043e \u0444\u0430\u0439\u043b\u044b <code>.so<\/code>\u00a0(<code>.dll<\/code> \u0432 Windows, <code>.dylib<\/code> OS X).\u00a0<a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/ldd.1.html\" rel=\"noopener noreferrer nofollow\"><strong>ldd<\/strong><\/a>\u00a0\u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041e\u043d \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c <code>ldd \/bin\/bash<\/code>\u00a0\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Alpine, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"powershell\">\/ # ldd \/bin\/ls \/lib\/ld-musl-aarch64.so.1 (0xffff8c9c0000) libc.musl-aarch64.so.1 => \/lib\/ld-musl-aarch64.so.1 (0xffff8c9c0000) \/ # ldd \/bin\/bash \/lib\/ld-musl-aarch64.so.1 (0xffffb905a000) libreadline.so.8 => \/usr\/lib\/libreadline.so.8 (0xffffb8f06000) libc.musl-aarch64.so.1 => \/lib\/ld-musl-aarch64.so.1 (0xffffb905a000) libncursesw.so.6 => \/usr\/lib\/libncursesw.so.6 (0xffffb8e95000)<\/code><\/pre>\n<h3>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438<\/h3>\n<ul>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c <em>soname<\/em>, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u0435\u0437 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u0435\u0440\u0441\u0438\u0438. \u041e\u043d\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 <code>lib<\/code>, \u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 <code>.so<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>libpcre2-8.so.0<\/code>\u00a0\u0438\u043c\u0435\u0435\u0442 soname\u00a0<code>libpcre2-8.so<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0<code>\/usr\/lib\/libpcre2-8.so.0<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c <code>libpcre2-8.so.0.3.6<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u044d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0414\u043b\u044f \u043d\u0430\u0441 \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u0430. \u041d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u044d\u0442\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ugit.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u00a0<code>=><\/code>\u00a0\u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u0441 <code>libc<\/code> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 C \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u00abexec \/bin\/bash: no such file or directory\u00bb? \u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0451 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 C \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0446\u0438\u0442\u0430\u0442\u0430 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/twitter.com\/dcreager\/\" rel=\"noopener noreferrer nofollow\">\u0414\u0443\u0433\u043b\u0430\u0441\u0430 \u041a\u0440\u0438\u0433\u0435\u0440\u0430<\/a>\u00a0\u043e <a href=\"https:\/\/dcreager.net\/2017\/10\/shared-library-versions\/\" rel=\"noopener noreferrer nofollow\">\u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043e\u0431\u0449\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0449\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<blockquote>\n<p><em>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u0449\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437,<\/em><\/p>\n<\/blockquote>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-367305","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/367305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=367305"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/367305\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=367305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=367305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=367305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}