<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>ntdesmond</title><author><name>ntdesmond</name></author><id>https://teletype.in/atom/ntdesmond</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/ntdesmond?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@ntdesmond?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ntdesmond"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/ntdesmond?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-06T08:56:08.163Z</updated><entry><id>ntdesmond:Actions_Docker_GHCR</id><link rel="alternate" type="text/html" href="https://teletype.in/@ntdesmond/Actions_Docker_GHCR?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ntdesmond"></link><title>GitHub Actions, Docker, GitHub Registry</title><published>2023-01-07T21:36:17.107Z</published><updated>2023-01-07T21:36:17.107Z</updated><category term="programming" label="Programming"></category><summary type="html">&lt;img src=&quot;https://sun9-20.userapi.com/c240331/u245658637/d13/-3/x_94d96cbc52.jpg&quot;&gt;Долго соображал, куда можно засунуть Docker-контейнеры для одного проекта — не пихать же их на личный аккаунт Docker Hub? Поднимать свой registry тоже так себе вариант... Изучал тему, и обнаружил интересную штуку — GitHub Packages, которая включает в себя GitHub Container Registry (GHCR). Иными словами, это Docker Registry от гитхаба, который можно юзать бесплатно для открытых репозиториев, при этом настроить доступ к самому package (аналог image в Docker Hub) можно отдельно.</summary><content type="html">
  &lt;p id=&quot;ZVSA&quot;&gt;Долго соображал, куда можно засунуть Docker-контейнеры для одного проекта — не пихать же их на личный аккаунт Docker Hub? Поднимать свой registry тоже так себе вариант... Изучал тему, и обнаружил интересную штуку — GitHub Packages, которая включает в себя GitHub Container Registry (GHCR). Иными словами, это Docker Registry от гитхаба, который можно юзать &lt;a href=&quot;https://github.com/features/packages#pricing&quot; target=&quot;_blank&quot;&gt;бесплатно для открытых репозиториев&lt;/a&gt;, при этом настроить доступ к самому package (аналог image в Docker Hub) можно отдельно.&lt;/p&gt;
  &lt;figure id=&quot;K7yL&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://sun9-20.userapi.com/c240331/u245658637/d13/-3/x_94d96cbc52.jpg&quot; width=&quot;110&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;oe4S&quot;&gt;А что значит хостинг на самом GitHub? Правильно, более простая настройка GitHub Actions для сбора и выгрузки образа Docker. Самое крутое, что можно сделать универсальный файл workflow, который будет достаточно закинуть в любой репозиторий, чтобы контейнер собирался и выгружался на &lt;a href=&quot;http://ghcr.io&quot; target=&quot;_blank&quot;&gt;ghcr.io&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;V2Iz&quot;&gt;К примеру, &lt;a href=&quot;https://gist.github.com/ntdesmond/4ab1ed8473ef520f520dfb8a5433d059&quot; target=&quot;_blank&quot;&gt;вот такой&lt;/a&gt; workflow при каждом обновлении ветки соберет и выгрузит образ с тем же названием, что и у репозитория, при этом между запусками кэш будет сохраняться в том же &lt;a href=&quot;http://ghcr.io&quot; target=&quot;_blank&quot;&gt;ghcr.io&lt;/a&gt; под тегом &lt;code&gt;buildcache&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;UlM6&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e8/81/e8815ba0-4e2b-4047-938d-1fa9d94b6fdd.png&quot; width=&quot;747&quot; /&gt;
    &lt;figcaption&gt;Впрочем, этот самый &lt;code&gt;buildcache&lt;/code&gt; может не очень красиво смотреться&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6cIO&quot;&gt;На что стоит обратить внимание (на чем я споткнулся при настройке пайплайна):&lt;/p&gt;
  &lt;ul id=&quot;vjlT&quot;&gt;
    &lt;li id=&quot;mqYL&quot;&gt;Workflow должен иметь разрешение на запись в &lt;code&gt;packages&lt;/code&gt;. В противном случае он будет валиться с ошибкой 403 при попытке выгрузить образ. Впрочем, если не указывать &lt;code&gt;permissions &lt;/code&gt;вообще, должно по умолчанию быть разрешено работать с &lt;code&gt;packages&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;AP5w&quot; data-lang=&quot;yaml&quot;&gt;permissions:
  contents: read
  packages: write&lt;/pre&gt;
  &lt;ul id=&quot;riuW&quot;&gt;
    &lt;li id=&quot;H5dN&quot;&gt;По умолчанию (у меня так было в организации, по крайней мере) созданные packages будут приватными, даже в публичном репозитории. Это можно настроить на каждом репозитории отдельно, перед этим разрешив другие варианты в &lt;strong&gt;настройках организации&lt;/strong&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;eLyw&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/56/23/56231e7e-53b0-4c87-96b1-ff591db82ae3.png&quot; width=&quot;658&quot; /&gt;
    &lt;figcaption&gt;По умолчанию стоит только Private, несмотря на Inherit access&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;HLTt&quot;&gt;To sum up, настроив один раз Packages в организации и написав универсальный workflow, можно штамповать его везде и не париться о выгрузке контейнеров.&lt;/p&gt;

</content></entry><entry><id>ntdesmond:Python_Docker_multi-stage_build</id><link rel="alternate" type="text/html" href="https://teletype.in/@ntdesmond/Python_Docker_multi-stage_build?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=ntdesmond"></link><title>Python + Docker multi-stage build</title><published>2022-09-16T19:32:51.602Z</published><updated>2022-09-16T19:32:51.602Z</updated><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ac/d2/acd20469-cfcc-4a43-9b11-966903a9d868.png&quot;&gt;Все началось с того, как я по привычке использовал в учебном проекте venv в Docker-контейнере, на что мне в код-ревью сказали, что это просто трата ресурсов. Поискал в инете, люди говорят, что на самом деле особо пофиг, есть venv или же нет — как удобно, так и делай.
Однако, еще нашлось одно очень хорошее применение для использования виртуальной среды: раздельная установка зависимостей и запуск кода с помощью билда контейнера в несколько (2.00) этапов.</summary><content type="html">
  &lt;p id=&quot;Smqr&quot;&gt;Все началось с того, как я по привычке использовал в учебном проекте &lt;code&gt;venv&lt;/code&gt; в Docker-контейнере, на что мне в код-ревью сказали, что это просто трата ресурсов. Поискал в инете, люди говорят, что на самом деле особо пофиг, есть &lt;code&gt;venv&lt;/code&gt; или же нет — как удобно, так и делай.&lt;br /&gt;Однако, еще нашлось одно очень хорошее применение для использования виртуальной среды: раздельная установка зависимостей и запуск кода с помощью билда контейнера в несколько (2.00) этапов.&lt;/p&gt;
  &lt;p id=&quot;pVWZ&quot;&gt;Суть в том, что можно создать &lt;code&gt;venv&lt;/code&gt; на одном этапе, установить в него зависимости, а потом на новом этапе просто скопировать &lt;code&gt;venv&lt;/code&gt; целиком с предыдущего этапа.&lt;br /&gt;Такой подход позволяет использовать на последнем этапе более легковесные образы python (в моем случае для запуска хватило &lt;code&gt;3.10-alpine&lt;/code&gt;), при этом сохраняя все необходимое для установки зависимостей (много где требуется наличие &lt;code&gt;gcc&lt;/code&gt;, например).&lt;br /&gt;В моем случае вес итогового образа уменьшился практически в 8 раз (1.03GB -&amp;gt; 146MB).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;daKC&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/d2/acd20469-cfcc-4a43-9b11-966903a9d868.png&quot; width=&quot;714&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;HiZs&quot;&gt;Но.. даже тут я умудрился споткнуться и у меня произошла интересная ситуация (picrelated): вроде бы исполняемый файл есть, а запустить его нельзя.&lt;br /&gt;Я так и не выяснил конкретную суть проблемы, но ради интереса заглянув в &lt;code&gt;.venv/bin/activate&lt;/code&gt; обнаружил, что пути там указаны как &lt;code&gt;/.venv&lt;/code&gt; а не &lt;code&gt;/app/.venv&lt;/code&gt;, как это должно быть.&lt;/p&gt;
  &lt;p id=&quot;02XV&quot;&gt;Оказалось, что на первом этапе нужно было создавать виртуальную среду &lt;strong&gt;по тому же пути&lt;/strong&gt;, по которому она должна быть на последнем этапе. Тогда все пути внутри будут нормально матчиться.&lt;br /&gt;Теперь я, довольный как енот, пойду пушить новую версию образа и дальше делать лабу... Опять затуплю где-нибудь, чтоб найти повод для нового поста :)&lt;/p&gt;

</content></entry></feed>