{
    "version": "https:\/\/jsonfeed.org\/version\/1.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\/pictures\/userpic\/userpic@2x.jpg?1769095194",
    "authors": [
        {
            "name": "M",
            "url": "https:\/\/blog.m9k.space\/",
            "avatar": "https:\/\/blog.m9k.space\/pictures\/userpic\/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-сборка (пусть останется закешированной)\nFROM debian:bookworm AS openssl-build\n# ... \n# Stage 2: основная\nFROM debian:bookworm-slim\n# Аргумент, чтобы инвалидировать кэш\nARG CACHE_BREAKER=default\n# Используем его в ENV, чтобы Docker счёл слой новым\nENV CACHE_BREAKER=${CACHE_BREAKER}<\/code><\/pre>",
            "summary": "Возникла необходимость пересобрать отдельный stage-контейнер из Dockerfile. Первый собранный контейнер — это контейнер сборки OpenSSL, который выполняется очень",
            "date_published": "2025-08-05T15:47:54+07:00",
            "date_modified": "2025-08-05T15:47:44+07:00",
            "tags": [
                "DevOps",
                "docker",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Tue, 05 Aug 2025 15:47:54 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "197",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "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: &#039;3.5&#039;\nservices:\n  kafka:\n    image: bitnami\/kafka:2.6.0\n    ports:\n      - &quot;9092:9092&quot;\n    environment:\n      - KAFKA_BROKER_ID=1\n      - KAFKA_LISTENERS=PLAINTEXT:\/\/:9092\n      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:\/\/172.23.0.13:9092\n      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\n      - ALLOW_PLAINTEXT_LISTENER=yes\n    depends_on:\n      - zookeeper\n    networks:\n      clickhouse-network:\n        ipv4_address: 172.23.0.13\n  zookeeper:\n    image: zookeeper:3.5.8\n    container_name: zookeeper\n    hostname: zookeeper\n    ports:\n      - &quot;2181:2181&quot;\n    environment:\n      - ALLOW_ANONYMOUS_LOGIN=yes\n    networks:\n      clickhouse-network:\n        ipv4_address: 172.23.0.10\n  clickhouse01:\n    image: yandex\/clickhouse-server:20.8.12.2\n    container_name: clickhouse01\n    hostname: clickhouse01\n    networks:\n      clickhouse-network:\n        ipv4_address: 172.23.0.11\n    ports:\n      - &quot;127.0.0.1:8123:8123&quot;\n      - &quot;127.0.0.1:9000:9000&quot;\n    volumes:\n      - ${PWD}\/clickhouse01:\/etc\/clickhouse-server\n      - \/mnt\/volume\/clickhouse01\/data:\/var\/lib\/clickhouse\/\n      - \/mnt\/volume\/clickhouse01\/logs:\/var\/log\/clickhouse-server\/\n    depends_on:\n      - zookeeper\n  clickhouse02:\n    image: yandex\/clickhouse-server:20.8.12.2\n    container_name: clickhouse02\n    hostname: clickhouse02\n    networks:\n      clickhouse-network:\n        ipv4_address: 172.23.0.12\n    volumes:\n      - ${PWD}\/clickhouse02:\/etc\/clickhouse-server\n      - \/mnt\/volume\/clickhouse02\/data:\/var\/lib\/clickhouse\/\n      - \/mnt\/volume\/clickhouse02\/logs:\/var\/log\/clickhouse-server\/\n    depends_on:\n      - zookeeper\n\nnetworks:\n  clickhouse-network:\n    name: clickhouse-network\n    ipam:\n      config:\n        - subnet: 172.23.0.0\/24<\/code><\/pre>",
            "summary": "docker-compose.yml",
            "date_published": "2023-11-02T14:52:07+07:00",
            "date_modified": "2023-12-12T11:55:10+07:00",
            "tags": [
                "apache kafka",
                "clickhouse",
                "DevOps",
                "docker",
                "zookeeper",
                "администрирование",
                "системное администрирование"
            ],
            "_date_published_rfc2822": "Thu, 02 Nov 2023 14:52:07 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "150",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "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;\n    {% if True %}\n        yay\n    {% endif %}\n&lt;\/div&gt;<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">&lt;div&gt;\n\n        yay\n\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== &#039;value&#039; %}\n    &quot;bla&quot;\n{% else %}\n    &quot;bla-bla&quot;\n{% endif -%}<\/code><\/pre>",
            "summary": "Столкнулся с проблемой, что if-else condition отлично отрабатывает в рамках Ansible-скрипта, но при этом в выходном файле генерится после условия пустая строка",
            "date_published": "2023-10-19T17:48:54+07:00",
            "date_modified": "2023-10-19T17:52:43+07:00",
            "tags": [
                "ansible",
                "DevOps",
                "j2",
                "Jinja",
                "администрирование"
            ],
            "_date_published_rfc2822": "Thu, 19 Oct 2023 17:48:54 +0700",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "144",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4199,
    "_e2_ua_string": "Aegea 11.5 (v4199)"
}