{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "M9K blog: заметки с тегом DevOps",
    "_rss_description": "Заметки обо всём: devops, lifestyle, культура.",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/blog.m9k.space\/tags\/devops\/",
    "feed_url": "https:\/\/blog.m9k.space\/tags\/devops\/json\/",
    "icon": "https:\/\/blog.m9k.space\/user\/userpic@2x.jpg?1769095194",
    "author": {
        "name": "M",
        "url": "https:\/\/blog.m9k.space\/",
        "avatar": "https:\/\/blog.m9k.space\/user\/userpic@2x.jpg?1769095194"
    },
    "items": [
        {
            "id": "197",
            "url": "https:\/\/blog.m9k.space\/all\/multistage-docker-kak-peresobirat-bez-kesha-ne-ves-dockefile\/",
            "title": "Multistage Docker — как пересобирать без кэша не весь Dockefile",
            "content_html": "<p>Возникла необходимость пересобрать отдельный stage-контейнер из Dockerfile. Первый собранный контейнер — это контейнер сборки OpenSSL, который выполняется очень, очень долго. Для того, чтоб сэкономить время, во вторую часть добавляем:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># Stage 1: OpenSSL-сборка (пусть останется закешированной)\r\nFROM debian:bookworm AS openssl-build\r\n# ... \r\n# Stage 2: основная\r\nFROM debian:bookworm-slim\r\n# Аргумент, чтобы инвалидировать кэш\r\nARG CACHE_BREAKER=default\r\n# Используем его в ENV, чтобы Docker счёл слой новым\r\nENV CACHE_BREAKER=${CACHE_BREAKER}<\/code><\/pre>",
            "date_published": "2025-08-05T08:47:54+00:00",
            "date_modified": "2025-08-05T08:47:44+00:00",
            "_date_published_rfc2822": "Tue, 05 Aug 2025 08:47:54 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "197",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "150",
            "url": "https:\/\/blog.m9k.space\/all\/old-apache-kafka-zookeeper-clickhouse-in-docker\/",
            "title": "Old Apache Kafka + ZooKeeper + Clickhouse in Docker",
            "content_html": "<p><i>docker-compose.yml<\/i><\/p>\n<pre class=\"e2-text-code\"><code class=\"\">version: '3.5'\r\nservices:\r\n  kafka:\r\n    image: bitnami\/kafka:2.6.0\r\n    ports:\r\n      - &quot;9092:9092&quot;\r\n    environment:\r\n      - KAFKA_BROKER_ID=1\r\n      - KAFKA_LISTENERS=PLAINTEXT:\/\/:9092\r\n      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:\/\/172.23.0.13:9092\r\n      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\r\n      - ALLOW_PLAINTEXT_LISTENER=yes\r\n    depends_on:\r\n      - zookeeper\r\n    networks:\r\n      clickhouse-network:\r\n        ipv4_address: 172.23.0.13\r\n  zookeeper:\r\n    image: zookeeper:3.5.8\r\n    container_name: zookeeper\r\n    hostname: zookeeper\r\n    ports:\r\n      - &quot;2181:2181&quot;\r\n    environment:\r\n      - ALLOW_ANONYMOUS_LOGIN=yes\r\n    networks:\r\n      clickhouse-network:\r\n        ipv4_address: 172.23.0.10\r\n  clickhouse01:\r\n    image: yandex\/clickhouse-server:20.8.12.2\r\n    container_name: clickhouse01\r\n    hostname: clickhouse01\r\n    networks:\r\n      clickhouse-network:\r\n        ipv4_address: 172.23.0.11\r\n    ports:\r\n      - &quot;127.0.0.1:8123:8123&quot;\r\n      - &quot;127.0.0.1:9000:9000&quot;\r\n    volumes:\r\n      - ${PWD}\/clickhouse01:\/etc\/clickhouse-server\r\n      - \/mnt\/volume\/clickhouse01\/data:\/var\/lib\/clickhouse\/\r\n      - \/mnt\/volume\/clickhouse01\/logs:\/var\/log\/clickhouse-server\/\r\n    depends_on:\r\n      - zookeeper\r\n  clickhouse02:\r\n    image: yandex\/clickhouse-server:20.8.12.2\r\n    container_name: clickhouse02\r\n    hostname: clickhouse02\r\n    networks:\r\n      clickhouse-network:\r\n        ipv4_address: 172.23.0.12\r\n    volumes:\r\n      - ${PWD}\/clickhouse02:\/etc\/clickhouse-server\r\n      - \/mnt\/volume\/clickhouse02\/data:\/var\/lib\/clickhouse\/\r\n      - \/mnt\/volume\/clickhouse02\/logs:\/var\/log\/clickhouse-server\/\r\n    depends_on:\r\n      - zookeeper\r\n\r\nnetworks:\r\n  clickhouse-network:\r\n    name: clickhouse-network\r\n    ipam:\r\n      config:\r\n        - subnet: 172.23.0.0\/24<\/code><\/pre>",
            "date_published": "2023-11-02T07:52:07+00:00",
            "date_modified": "2023-12-12T04:55:10+00:00",
            "_date_published_rfc2822": "Thu, 02 Nov 2023 07:52:07 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "150",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "144",
            "url": "https:\/\/blog.m9k.space\/all\/j2-whitespace-control\/",
            "title": "j2 Whitespace Control",
            "content_html": "<p>Столкнулся с проблемой, что <i>if-else<\/i> condition отлично отрабатывает в рамках Ansible-скрипта, но при этом в выходном файле генерится после условия пустая строка. Поковырял <a href=\"https:\/\/jinja.palletsprojects.com\/en\/3.0.x\/templates\/#whitespace-control\">ман<\/a>, называется это <i>trim_blocks<\/i> и <i>lstrip_blocks<\/i> соответственно.<br \/>\nВыглядит следующим образом:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;div&gt;\r\n    {% if True %}\r\n        yay\r\n    {% endif %}\r\n&lt;\/div&gt;<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">&lt;div&gt;\r\n\r\n        yay\r\n\r\n&lt;\/div&gt;<\/code><\/pre><p>Лечится магическим символом:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">-<\/code><\/pre><p>В случае с генерируемым из темплейта Ansible-файла:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">{% if variable== 'value' %}\r\n    &quot;bla&quot;\r\n{% else %}\r\n    &quot;bla-bla&quot;\r\n{% endif -%}<\/code><\/pre>",
            "date_published": "2023-10-19T10:48:54+00:00",
            "date_modified": "2023-10-19T10:52:43+00:00",
            "_date_published_rfc2822": "Thu, 19 Oct 2023 10:48:54 +0000",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "144",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3877,
    "_e2_ua_string": "E2 (v3877; Aegea)"
}