<?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>Чевопс?</title><generator>teletype.in</generator><description><![CDATA[Девопс глазами программиста 👨‍💻
Практические примеры работы с Docker 🐳, Kubernetes ☸️ и облаками ☁️
Доступно, по делу, с юмором 🤡]]></description><image><url>https://img4.teletype.in/files/f9/c1/f9c1650b-5906-4d02-91e8-bb8caaaa856f.png</url><title>Чевопс?</title><link>https://teletype.in/@chevops</link></image><link>https://teletype.in/@chevops?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/chevops?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/chevops?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sun, 05 Apr 2026 08:11:18 GMT</pubDate><lastBuildDate>Sun, 05 Apr 2026 08:11:18 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@chevops/localhost-direct</guid><link>https://teletype.in/@chevops/localhost-direct?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops</link><comments>https://teletype.in/@chevops/localhost-direct?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops#comments</comments><dc:creator>chevops</dc:creator><title>Localhost в опасности, или на Кинг-Стрит опять раздают SSL-сертификаты</title><pubDate>Wed, 25 Jan 2023 23:01:47 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fa/b1/fab197a0-847d-4e1a-b648-8ceb07418b59.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/43/cb/43cbafe3-829b-497a-a9d4-e88e4767c2d1.png"></img>Дело было в феврале 2019 года, когда некто сэр Нова Альтэс из Манчестера, его величества Соединенного Королевства, в одно воскресное и, непременно, дождливое британское утро, обзавелся новеньким SSL-сертификатом на имеющийся в его распоряжении домен localhost.direct. Однако приобретенный набор криптографических последовательностей сэр Альтэс намеревался использовать отнюдь не в целях безопасности личной коллекции Интернет-ресурсов, а в целях весьма благородных — пожертвовать приватный ключ мировому сообществу веб-разработчиков. И вот уже три года подряд сэр Альтэс исправно вносит весьма приличную для обычного программиста из северной Англии сумму фунтов стерлингов на счет центра сертификации Google Trust Services LLC, который, в свою...]]></description><content:encoded><![CDATA[
  <figure id="1rno" class="m_original">
    <img src="https://img1.teletype.in/files/43/cb/43cbafe3-829b-497a-a9d4-e88e4767c2d1.png" width="2000" />
  </figure>
  <p id="hPvL">Дело было в феврале 2019 года, когда некто сэр Нова Альтэс из Манчестера, его величества Соединенного Королевства, в одно воскресное и, непременно, дождливое британское утро, обзавелся новеньким SSL-сертификатом на имеющийся в его распоряжении домен <em>localhost.direct. </em>Однако приобретенный набор криптографических последовательностей сэр Альтэс намеревался использовать отнюдь не в целях безопасности личной коллекции Интернет-ресурсов, а в целях весьма благородных — пожертвовать приватный ключ мировому сообществу веб-разработчиков. И вот уже три года подряд сэр Альтэс исправно вносит весьма приличную для обычного программиста из северной Англии сумму фунтов стерлингов на счет центра сертификации <em>Google Trust Services LLC</em>, который, в свою очередь, с большой охотой продлевает срок действия сертификата еще на 12 месяцев, после чего мистер Нова загружает свежий приватный ключ в <a href="https://github.com/Upinel/localhost.direct#download" target="_blank">открытый доступ</a>.</p>
  <p id="Ke34">Что же такого особенного заключается в этом самом сертификате, и чем он может быть полезен сообществу IT? Для ответа на этот вопрос давайте обратим внимание на домен, для которого искомый сертификат, предназначается, а именно — <em>localhost.direct</em>:</p>
  <pre id="p5ia">$ nslookup localhost.direct
...
Non-authoritative answer:
Name:	localhost.direct
Address: 127.0.0.1</pre>
  <p id="S0RC">Аналогичный ответ от DNS мы получаем при проверке любого сабдомена следующего уровня:</p>
  <pre id="WBRw">$ nslookup whatever.localhost.direct
...
Non-authoritative answer:
Name:	whatever.localhost.direct
Address: 127.0.0.1</pre>
  <p id="v8ni">Нетрудно догадаться, что сэр Альтэс позаботился о том, чтобы домен <code>localhost.direct</code>, ровно как и любой домен, подходящий под маску <code>*.localhost.direct</code> , вели на <code>127.0.0.1</code>, то есть на сетевой интерфейс <em>внутренней петли</em>, он же <code>localhost</code>. Поскольку соответствующие DNS-записи внесены в публичную базу DNS, а ключ SSL-сертификата находится в свободном доступе, — любой желающий имеет возможность защитить свой собственный <em>localhost</em> сертификатом, выданным авторитетным центром.</p>
  <p id="YOpk"></p>
  <h3 id="iyKd">Демо</h3>
  <p id="BVug">Скачаем с <a href="https://github.com/Upinel/localhost.direct#download" target="_blank">ресурса</a> сэра Альтэса подписанный сертификат вместе с ключом и положим их в директорию <code>~/localhost.direct</code>:</p>
  <pre id="mNC2">$ mkdir -p ~/localhost.direct
$ curl -o certs.zip -LOs https://aka.re/localhost
$ unzip -P localhost certs.zip
$ rm certs.zip
$ ls
localhost.direct.crt localhost.direct.key</pre>
  <p id="ZgJK">Создадим простой <code>nginx.conf</code>:</p>
  <figure>
    <script src="https://gist.github.com/igops/22c286522e02c008ffc6c59e893603d3.js"></script>
  </figure>
  <p id="YI1j">Запустим контейнер <code>nginx:alpine</code>, подложив внутрь <code>nginx.conf</code>, подписанный сертификат и его ключ:</p>
  <pre id="Ncrx">$ docker run --rm \
-v $PWD/nginx.conf:/etc/nginx/conf.d/default.conf \
-v $PWD/localhost.direct.crt:/etc/nginx/certs/localhost.direct.crt \
-v $PWD/localhost.direct.key:/etc/nginx/certs/localhost.direct.key \
-p 80:80 \
-p 443:443 \
nginx:alpine</pre>
  <p id="nsye">Откроем <a href="https://localhost.direct" target="_blank">https://localhost.direct</a> в браузере. Сертификат работает.</p>
  <p id="Btff"><em>— Вы уже скучаете по боли от самоподписанных сертификатов и паническим надписям «Connection is not secure»?</em></p>
  <figure id="xhAJ" class="m_column">
    <img src="https://img2.teletype.in/files/93/ea/93eab118-1c10-4300-b2c6-602a1cea0b4f.png" width="1476" />
  </figure>
  <p id="lcdD">Пример роутинга по сабдоменам:</p>
  <figure>
    <script src="https://gist.github.com/igops/e95d250ab1806e291b01a1c32d3bc292.js"></script>
  </figure>
  <p id="8owj">Результат:</p>
  <figure id="Rxnp" class="m_column">
    <img src="https://img3.teletype.in/files/a7/68/a768fbdb-453c-4de4-9fce-0b796c59a41a.png" width="1224" />
  </figure>
  <figure id="Ea1F" class="m_column">
    <img src="https://img1.teletype.in/files/49/21/4921b1ac-b13d-4dbc-a0aa-aa2b1fa59c53.png" width="1224" />
  </figure>
  <p id="Q0fj">Идея проекта <em>localhost.direct </em>максимально проста и изящна<em>. Kudos</em>, сэр Альтэс!</p>
  <p id="pmJ2">Официальная страница проекта: <a href="https://get.localhost.direct" target="_blank">https://get.localhost.direct</a>.</p>
  <p id="CV5o"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="C4or" data-align="center"><strong>Подпишись на телеграм «чевопса»</strong></p>
    <p id="JQUx" data-align="center"><a href="https://t.me/chevops" target="_blank">https://t.me/chevops</a></p>
    <p id="dJ7K" data-align="center"><em>Девопс глазами программиста 👨‍💻</em></p>
    <p id="hDw1" data-align="center"><em>Практические примеры работы с Docker 🐳, Kubernetes ☸️ и облаками ☁️</em></p>
    <p id="ZUhH" data-align="center"><em>Доступно, по делу, с юмором 🤡</em></p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chevops/docker-fast-maven-build</guid><link>https://teletype.in/@chevops/docker-fast-maven-build?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops</link><comments>https://teletype.in/@chevops/docker-fast-maven-build?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops#comments</comments><dc:creator>chevops</dc:creator><title>Готовим докерфайл для быстрой сборки JAR используя Maven</title><pubDate>Tue, 17 Jan 2023 10:16:34 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/35/5a/355ae7cf-fb10-4437-a395-3fc4a7dc8908.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/4d/5f/4d5f0699-2274-40fa-b4c4-1ed2640921d8.png"></img>Рассмотрим пример maven-проекта из sping guides. Он имеет следующую структуру:]]></description><content:encoded><![CDATA[
  <figure id="Osgs" class="m_original">
    <img src="https://img1.teletype.in/files/4d/5f/4d5f0699-2274-40fa-b4c4-1ed2640921d8.png" width="2000" />
  </figure>
  <p id="K3rx">Рассмотрим <a href="https://github.com/spring-guides/gs-maven/tree/main/complete" target="_blank">пример</a> maven-проекта из <em>sping guides</em>. Он имеет следующую структуру:</p>
  <pre id="cRxE">├── mvnw
├── mvnw.cmd
├── pom.xml
├── src
├── main
│   └── java
│       └── hello
│           ├── Greeter.java
│           └── HelloWorld.java
├── test
├── java
├── hello
└── GreeterTest.java</pre>
  <p id="WVgz">Самый банальный Dockerfile «на скорую руку» может выглядеть следующим образом:</p>
  <figure>
    <script src="https://gist.github.com/igops/9b6cabcfc9c7601c63b385a073dded51.js"></script>
  </figure>
  <p id="bvme">Рассмотрим способы оптимизации.</p>
  <p id="7VGU"></p>
  <h3 id="joys"><strong>1. Шаг перый: Кешируем зависимости</strong></h3>
  <p id="X4RG">Как правило, в процессе активной разработки, список зависимостей <strong>меняется реже</strong> чем бизнес-логика и тесты. Воспользуемся этим знанием: вынесем dependencies в отдельной слой и расположим его до слоя <code>COPY src src</code>. Согласно идеологии <em>docker layers</em>, изменение слоя инвалидирует <strong>только те слои, которые расположены после данного</strong>, поэтому изменение содержимого директории <em>src</em> не будет инвалидировать слой зависимостей.</p>
  <p id="CbxS">Осталось теперь только придумать, как выделить <em>dependencies</em> в отдельный слой. В качестве решения, можно сначала скормить мавену голый <em>pom.xml</em> без директории <em>src</em>, а позже скопмилировать проект, используя уже имеющиеся зависимости:</p>
  <figure>
    <script src="https://gist.github.com/igops/d5daa59984b988a5d9d39c2fd2d28d07.js"></script>
  </figure>
  <p id="ZIP7">Согласно <em>maven build lifecycle</em>, <em>mvn verify</em> выполнит фазы <em>validate</em>, <em>compile</em>, <em>test</em>, <em>package</em> и сам <em>verify</em>. Поскольку на данном этапе в директории /build есть только <em>pom.xml</em> — сам исходный код скомпилирован не будет, но все зависимости из <em>pom.xml</em> будут установлены в локальный репозиторий <em>~/.m2</em>.</p>
  <p id="oJlh">Следующими двумя слоями мы копируем директорию src и компилируем jar-файл командой <em>mvn package</em>. <strong>Большинство</strong> зависимостей будет зачитано мавеном из локального репозитория.</p>
  <p id="xKZw">Исследуем слои промежуточного stage образа командой <a href="https://github.com/wagoodman/dive" target="_blank">dive</a>:</p>
  <pre id="m0R9">       0 B  WORKDIR /build
    1.6 kB  COPY pom.xml .
     18 MB  RUN /bin/sh -c mvn --fail-never verify
     715 B  COPY src src
    682 kB  RUN /bin/sh -c mvn package</pre>
  <p id="eStg">Итого, на данном этапе мы добились следующего поведения:</p>
  <ul id="5svM">
    <li id="ZbDm">изменение директории <em>src</em> (частое действие) приводит к инвалидации только двух последних двух слоев, «тяжелые» слои, расположенные ДО — остаются в кеше</li>
    <li id="sIuz">изменение файла <em>pom.xml</em> (редкое действие) приводит к инвалидации последних четырех слоев</li>
  </ul>
  <p id="xAgL"></p>
  <h3 id="Iw1d"><strong>2. Шаг второй: Исключаем тесты</strong></h3>
  <p id="FQxa">Если выполнение тестов при сборке не является частью вашего CI/CD, их можно пропустить, используя флаг <code>-DskipTests</code>. Наличие этого флага позволяет пропустить выполнение тестов, однако не исключает тесты из <strong>компиляции</strong>. Полный отказ от тестов реализуется при помощи двух флагов <code>-Dmaven.test.skip -DskipTests</code>.</p>
  <p id="5uta">Теперь, когда тесты исключены, maven больше не нуждается в плагине <em>Maven Surefire Plugin</em>, который используется на этапе <em>mvn test</em>. Поскольку, это <strong>единственный артифакт</strong>, который добавлялся в локальный репозиторий в слое <em>RUN mvn package</em> (легко проверить командой <em>dive</em>), теперь мы можем использовать флаг <code>-o</code>, который запрещает обращение к <em>remote</em> репозиториям и вынуждает мавен читать локальный репозиторий:</p>
  <figure>
    <script src="https://gist.github.com/igops/4c74e1c0c52e89d51fa3d85c4533dd57.js"></script>
  </figure>
  <p id="YO0U">Сборка стала заметно быстрее, а размер последнего слоя <em>stage=build</em> снизился с 682 до 634kB (проверьте ваши слои самостоятельно командой <em>dive</em> или <em>docker history</em>). Благодаря флагу <em><code>-o</code></em>, <strong>все</strong> зависимости зачитаны мавеном из локального репозитория.</p>
  <p id="rGgK"></p>
  <h3 id="e4J9"><strong>3. Шаг третий: Используем параллельную сборку</strong></h3>
  <p id="1uSO">Maven версии 3+ позволяет использовать <a href="https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3" target="_blank">parallel builds</a>:</p>
  <blockquote id="Kmgi"><em>mvn -T 4 clean install # Builds with 4 threads<br />mvn -T 1C clean install # 1 thread per cpu core<br />mvn -T 1.5C clean install # 1.5 thread per cpu core</em></blockquote>
  <p id="jSFd">Распараллелим сборку по 10 потоков на каждое ядро, доступное докеру:</p>
  <figure>
    <script src="https://gist.github.com/igops/84e5188f9cd4dfb8502de249bfeb4bb9.js"></script>
  </figure>
  <p id="fB6Y">Мы рассмотрели несколько способов оптимизации maven-сборки в экосистеме докера. В промышленных масштабах, подобная оптимизация экономит уйму времени ожидания, как ускоряя CI/CD pipeline, так и уменьшая биллинг за процессорное время.</p>
  <p id="byu5"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="XJqN" data-align="center"><strong>Подпишись на телеграм «чевопса»</strong></p>
    <p id="q4Ko" data-align="center"><a href="https://t.me/chevops" target="_blank">https://t.me/chevops</a></p>
    <p id="y1eN" data-align="center"><em>Девопс глазами программиста 👨‍💻</em></p>
    <p id="42Gj" data-align="center"><em>Практические примеры работы с Docker 🐳, Kubernetes ☸️ и облаками ☁️</em></p>
    <p id="u5wp" data-align="center"><em>Доступно, по делу, с юмором 🤡</em></p>
  </section>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@chevops/revealing-docker-entrypoint</guid><link>https://teletype.in/@chevops/revealing-docker-entrypoint?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops</link><comments>https://teletype.in/@chevops/revealing-docker-entrypoint?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=chevops#comments</comments><dc:creator>chevops</dc:creator><title>О чем молчат докер-контейнеры, или 4 способа узнать entrypoint</title><pubDate>Tue, 17 Jan 2023 09:48:44 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c9/86/c9860515-8ec5-4762-848d-d88263b73d07.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/82/c3/82c32abc-098e-446b-a5e6-c22a51dcc88e.png"></img>Часто бывает, что документация по запуску того или иного контейнера либо отсутствует, либо ее качество оставляет желать лучшего. На своей практике я наблюдал множество случаев, когда docker run приводил к многозначительному молчанию консоли, после чего процесс завершался без какого-либо видимого эффекта:]]></description><content:encoded><![CDATA[
  <figure id="0bRa" class="m_original">
    <img src="https://img1.teletype.in/files/82/c3/82c32abc-098e-446b-a5e6-c22a51dcc88e.png" width="2000" />
  </figure>
  <p id="1t4i">Часто бывает, что документация по запуску того или иного контейнера либо отсутствует, либо ее качество оставляет желать лучшего. На своей практике я наблюдал множество случаев, когда <em>docker run </em>приводил к многозначительному молчанию консоли, после чего процесс завершался без какого-либо видимого эффекта:</p>
  <figure id="Ef40" class="m_column">
    <img src="https://img4.teletype.in/files/70/f1/70f14822-a3c3-495c-9b5d-d749ad9963e9.gif" width="1614" />
    <figcaption>«Молчаливый» Alpine</figcaption>
  </figure>
  <p id="orZm">Давайте рассмотрим несколько  техник, которые помогут вам разобраться с запуском любого контейнера.</p>
  <p id="vxG8"></p>
  <h3 id="Jfmy"><strong>1. Найдите Dockerfile</strong></h3>
  <p id="mRlV">Dockerfile представляет собой набор инструкций для сборки образа и последующего запуска контейнера. Лучшим рецептом исследования проблемы «молчаливого» старта является изучение непосредственно самого docker-файла. При запуске контейнера выполняется команда, указанная в инструкции <em>ENTRYPOINT</em>:</p>
  <figure id="mOSx" class="m_column">
    <img src="https://img1.teletype.in/files/48/af/48afbdc4-7d4c-41ab-ac26-3c09f637b200.gif" width="1614" />
  </figure>
  <p id="r74w">Dockerfile в исходном виде не является частью собранного образа, поэтому проще всего отыскать оригинал. Если автор образа — не вы, то попробуйте найти репозиторий исходного кода, откуда образ был собран. Как правило, помогает гугление запросов из разряда «<em>some-image docker github</em>». Используйте поиск по гитхаб-репозиторию, чтобы найти искомый Dockerfile.</p>
  <p id="8j3W">Если в docker-файле отсутствует инструкция <em>ENTRYPOINT</em>, найдите самую последнюю инструкцию <em>FROM</em>, и далее изучите родительский образ аналогичным способом.</p>
  <p id="3fg2">Если вам не удалось найти <em>ENTRYPOINT</em>, или у вас нет уверенности, что найденный Dockerfile соответствует искомому контейнеру, переходите к следующим техникам.</p>
  <p id="YbvX"></p>
  <h3 id="EoUT"><strong>2. Зачитайте Entrypoint из конфигурации образа</strong></h3>
  <p id="EKZq"><code>$ docker inspect some-image -f &quot;{{.Config.Entrypoint}}&quot;</code></p>
  <figure id="Ixkt" class="m_column">
    <img src="https://img2.teletype.in/files/1d/b8/1db82fb2-5d12-414d-9d55-a3a1b85d1adf.gif" width="1614" />
  </figure>
  <p id="NyAN">Эта команда дешево и сердито выведет искомый <em>ENTRYPOINT</em>. Зачем же тогда искать Docker-файл, если есть такая простая и понятная команда? Дело в том, что Dockerfile является наиболее полным представлением о содержимом образа, в то время как <em>docker inspect</em> просто выдает параметры конфигурации, одним из которых, в том числе, является <em>ENTRYPOINT</em>:</p>
  <pre id="Jhjc">$ docker inspect nginx -f &quot;{{.Config.Entrypoint}}&quot;
[/docker-entrypoint.sh]</pre>
  <p id="n8Hq"><em>Образ Nginx выполняет команду </em>/docker-entrypoint.sh<em> при запуске контейнера.</em></p>
  <p id="0EcQ"></p>
  <h3 id="1kQo">3. <strong>Скопируйте Entrypoint-скрипт из контейнера на вашу машину</strong></h3>
  <pre id="OTqG">$ docker run \
-v /path/on/host:/mount-dir \
--entypoint cp \
some-image /path/in/container /mount-dir</pre>
  <p id="BPos"><em>Скопирует /path/in/container из образа some-image на хост в директорию /path/on/host (на Windows вместо обратного слеша «\» использовать «^» — здесь и далее).</em></p>
  <pre id="HjMH">$ docker run \
-v $PWD:/mount --entypoint cp \
nginx /docker-entrypoint.sh /mount</pre>
  <p id="p6kp"><em>Теперь в вашей рабочей директории есть файл </em>/docker-entrypoint.sh<em> из образа Nginx</em> (<em>на Windows вместо $PWD использовать %cmd%)</em></p>
  <p id="5W43">Кстати, я использую эту команду для копирования любого файла из образа. Разберем подробнее, как она работает:</p>
  <ul id="ln1l">
    <li id="Xvz8"><code>-v /path/on/host:/mount-dir</code> замаунтить директорию хоста <em>/path/on/host</em> в контейнер на путь <em>/mount-dir</em></li>
    <li id="Qinn"><code>--entypoint cp</code> при старте контейра использовать команду <em>cp</em> (сокращение от <em>copy</em>, то есть <em>скопировать</em>)</li>
    <li id="CVPP"><code>/path/in/container /mount-dir</code> параметры запуска контейнера, в данном случае - параметры команды <em>cp</em> - скопировать <em>откуда</em> и скопировать <em>куда</em></li>
  </ul>
  <p id="rsNy">Как итог, файл <em>/path/in/container</em> копируется в директорию <em>/path/on/host</em>.</p>
  <p id="rRHm">Работает гораздо быстрее чем <em>docker save</em> и не требует запущенного контейнера, как <em>docker copy</em>.</p>
  <p id="w2Jy"></p>
  <h3 id="cjv8">4. <strong>Запустите контейнер в режиме линукс-терминала</strong></h3>
  <pre id="Pt0V">$ docker run -it --entrypoint=sh some-image</pre>
  <p id="CVST">В большинство docker-образов предуставновлен <em>Bourne shell</em> (/bin/sh), что позволяет вам использовать его в качестве терминала (не забудьте флаги -it, которые инициируют интерактивную консоль контейнера):</p>
  <p id="16at"><em>Запускаем контейнер nginx, используя sh в качестве entrypoint:</em></p>
  <pre id="JBcR">$ docker run -it --entrypoint=sh nginx</pre>
  <p id="3k8O"><em>Изучаем оригинальный entrypoint, выявленный предыдущими методами:</em></p>
  <pre id="pAMl">$ less /docker-entrypoint.sh</pre>
  <p id="QpVg"><em>Используем другие возможности линукса, находясь внутри контейнера:</em></p>
  <pre id="XVEA">$ bash
$ ls -la /etc/nginx/conf.d</pre>
  <p id="dkd0"></p>
  <h3 id="9FzW"><strong>Домашнее задание</strong></h3>
  <p id="xFnF">Объясните, почему <code>$ docker run alpine</code> завершается сразу после старта.</p>
  <p id="T9ma"></p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="6IGn" data-align="center"><strong>Подпишись на телеграм «чевопса»</strong></p>
    <p id="Wp5M" data-align="center"><a href="https://t.me/chevops" target="_blank">https://t.me/chevops</a></p>
    <p id="r8II" data-align="center"><em>Девопс глазами программиста 👨‍💻</em></p>
    <p id="mXue" data-align="center"><em>Практические примеры работы с Docker 🐳, Kubernetes ☸️ и облаками ☁️</em></p>
    <p id="R2dc" data-align="center"><em>Доступно, по делу, с юмором 🤡</em></p>
  </section>

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