<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>ntdesmond</title><generator>teletype.in</generator><description><![CDATA[ntdesmond]]></description><image><url>https://img2.teletype.in/files/9d/f4/9df42e3f-9d3b-4f04-98c4-076771fcf1ad.png</url><title>ntdesmond</title><link>https://teletype.in/@ntdesmond</link></image><link>https://teletype.in/@ntdesmond?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ntdesmond</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/ntdesmond?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/ntdesmond?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 06 Apr 2026 10:33:03 GMT</pubDate><lastBuildDate>Mon, 06 Apr 2026 10:33:03 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@ntdesmond/Actions_Docker_GHCR</guid><link>https://teletype.in/@ntdesmond/Actions_Docker_GHCR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ntdesmond</link><comments>https://teletype.in/@ntdesmond/Actions_Docker_GHCR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ntdesmond#comments</comments><dc:creator>ntdesmond</dc:creator><title>GitHub Actions, Docker, GitHub Registry</title><pubDate>Sat, 07 Jan 2023 21:36:17 GMT</pubDate><category>Programming</category><description><![CDATA[<img src="https://sun9-20.userapi.com/c240331/u245658637/d13/-3/x_94d96cbc52.jpg"></img>Долго соображал, куда можно засунуть Docker-контейнеры для одного проекта — не пихать же их на личный аккаунт Docker Hub? Поднимать свой registry тоже так себе вариант... Изучал тему, и обнаружил интересную штуку — GitHub Packages, которая включает в себя GitHub Container Registry (GHCR). Иными словами, это Docker Registry от гитхаба, который можно юзать бесплатно для открытых репозиториев, при этом настроить доступ к самому package (аналог image в Docker Hub) можно отдельно.]]></description><content:encoded><![CDATA[
  <p id="ZVSA">Долго соображал, куда можно засунуть Docker-контейнеры для одного проекта — не пихать же их на личный аккаунт Docker Hub? Поднимать свой registry тоже так себе вариант... Изучал тему, и обнаружил интересную штуку — GitHub Packages, которая включает в себя GitHub Container Registry (GHCR). Иными словами, это Docker Registry от гитхаба, который можно юзать <a href="https://github.com/features/packages#pricing" target="_blank">бесплатно для открытых репозиториев</a>, при этом настроить доступ к самому package (аналог image в Docker Hub) можно отдельно.</p>
  <figure id="K7yL" class="m_retina">
    <img src="https://sun9-20.userapi.com/c240331/u245658637/d13/-3/x_94d96cbc52.jpg" width="110" />
  </figure>
  <p id="oe4S">А что значит хостинг на самом GitHub? Правильно, более простая настройка GitHub Actions для сбора и выгрузки образа Docker. Самое крутое, что можно сделать универсальный файл workflow, который будет достаточно закинуть в любой репозиторий, чтобы контейнер собирался и выгружался на <a href="http://ghcr.io" target="_blank">ghcr.io</a>.</p>
  <p id="V2Iz">К примеру, <a href="https://gist.github.com/ntdesmond/4ab1ed8473ef520f520dfb8a5433d059" target="_blank">вот такой</a> workflow при каждом обновлении ветки соберет и выгрузит образ с тем же названием, что и у репозитория, при этом между запусками кэш будет сохраняться в том же <a href="http://ghcr.io" target="_blank">ghcr.io</a> под тегом <code>buildcache</code>.</p>
  <figure id="UlM6" class="m_original">
    <img src="https://img3.teletype.in/files/e8/81/e8815ba0-4e2b-4047-938d-1fa9d94b6fdd.png" width="747" />
    <figcaption>Впрочем, этот самый <code>buildcache</code> может не очень красиво смотреться</figcaption>
  </figure>
  <p id="6cIO">На что стоит обратить внимание (на чем я споткнулся при настройке пайплайна):</p>
  <ul id="vjlT">
    <li id="mqYL">Workflow должен иметь разрешение на запись в <code>packages</code>. В противном случае он будет валиться с ошибкой 403 при попытке выгрузить образ. Впрочем, если не указывать <code>permissions </code>вообще, должно по умолчанию быть разрешено работать с <code>packages</code>.</li>
  </ul>
  <pre id="AP5w" data-lang="yaml">permissions:
  contents: read
  packages: write</pre>
  <ul id="riuW">
    <li id="H5dN">По умолчанию (у меня так было в организации, по крайней мере) созданные packages будут приватными, даже в публичном репозитории. Это можно настроить на каждом репозитории отдельно, перед этим разрешив другие варианты в <strong>настройках организации</strong>:</li>
  </ul>
  <figure id="eLyw" class="m_original">
    <img src="https://img2.teletype.in/files/56/23/56231e7e-53b0-4c87-96b1-ff591db82ae3.png" width="658" />
    <figcaption>По умолчанию стоит только Private, несмотря на Inherit access</figcaption>
  </figure>
  <p id="HLTt">To sum up, настроив один раз Packages в организации и написав универсальный workflow, можно штамповать его везде и не париться о выгрузке контейнеров.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ntdesmond/Python_Docker_multi-stage_build</guid><link>https://teletype.in/@ntdesmond/Python_Docker_multi-stage_build?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ntdesmond</link><comments>https://teletype.in/@ntdesmond/Python_Docker_multi-stage_build?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ntdesmond#comments</comments><dc:creator>ntdesmond</dc:creator><title>Python + Docker multi-stage build</title><pubDate>Fri, 16 Sep 2022 19:32:51 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/ac/d2/acd20469-cfcc-4a43-9b11-966903a9d868.png"></img>Все началось с того, как я по привычке использовал в учебном проекте venv в Docker-контейнере, на что мне в код-ревью сказали, что это просто трата ресурсов. Поискал в инете, люди говорят, что на самом деле особо пофиг, есть venv или же нет — как удобно, так и делай.
Однако, еще нашлось одно очень хорошее применение для использования виртуальной среды: раздельная установка зависимостей и запуск кода с помощью билда контейнера в несколько (2.00) этапов.]]></description><content:encoded><![CDATA[
  <p id="Smqr">Все началось с того, как я по привычке использовал в учебном проекте <code>venv</code> в Docker-контейнере, на что мне в код-ревью сказали, что это просто трата ресурсов. Поискал в инете, люди говорят, что на самом деле особо пофиг, есть <code>venv</code> или же нет — как удобно, так и делай.<br />Однако, еще нашлось одно очень хорошее применение для использования виртуальной среды: раздельная установка зависимостей и запуск кода с помощью билда контейнера в несколько (2.00) этапов.</p>
  <p id="pVWZ">Суть в том, что можно создать <code>venv</code> на одном этапе, установить в него зависимости, а потом на новом этапе просто скопировать <code>venv</code> целиком с предыдущего этапа.<br />Такой подход позволяет использовать на последнем этапе более легковесные образы python (в моем случае для запуска хватило <code>3.10-alpine</code>), при этом сохраняя все необходимое для установки зависимостей (много где требуется наличие <code>gcc</code>, например).<br />В моем случае вес итогового образа уменьшился практически в 8 раз (1.03GB -&gt; 146MB).</p>
  <hr />
  <figure id="daKC" class="m_original">
    <img src="https://img3.teletype.in/files/ac/d2/acd20469-cfcc-4a43-9b11-966903a9d868.png" width="714" />
  </figure>
  <p id="HiZs">Но.. даже тут я умудрился споткнуться и у меня произошла интересная ситуация (picrelated): вроде бы исполняемый файл есть, а запустить его нельзя.<br />Я так и не выяснил конкретную суть проблемы, но ради интереса заглянув в <code>.venv/bin/activate</code> обнаружил, что пути там указаны как <code>/.venv</code> а не <code>/app/.venv</code>, как это должно быть.</p>
  <p id="02XV">Оказалось, что на первом этапе нужно было создавать виртуальную среду <strong>по тому же пути</strong>, по которому она должна быть на последнем этапе. Тогда все пути внутри будут нормально матчиться.<br />Теперь я, довольный как енот, пойду пушить новую версию образа и дальше делать лабу... Опять затуплю где-нибудь, чтоб найти повод для нового поста :)</p>

]]></content:encoded></item></channel></rss>