Patch Kolla via Template

Kolla 多少還是有一些不合需求的地方,我們可以透過 Kolla Template 的方式修改 Dockerfile ,不用直接硬修改 Kolla 本身,而是透過 Kolla 提供的 Plugin 安裝接口修正。

修改的同時可能需要一些 Jinja (Template Engine) 的一些知識,可以參考 Jinja 官網的文件,也需要 Dockerfile 的撰寫知識。

簡單教學

可以修改的地方非常多,我這邊就講解最簡單的 Patch 項目。

一般而言我們上 Patch 都會在最後的最後,才把我們修正的部分加進去,避免中間操作,又把我們修正的部分還原。Kolla Dockerfile 中提供了 <service image>-footer 的區塊,供我們插入 Plugin 或是其他額外的檔案設定。

就例如說前文,我們要修正 QEMU 的軟體包,那我們可以在 template-override.j2 這個檔案中修正 Nova-Libvirt 。

# in template-override.j2
{% extends parent_template %}

{% block nova_libvirt_footer %}
ADD \
    http://<some ip>/qemu-utils_2.11+dfsg-1ubuntu7.6_arm64.deb \
    /patch/
RUN dpkg -i /patch/*.deb
{% endblock %}

Kolla 建置 Image 的時候新增以下參數

tools/build.py --template-override template-override.j2

就可以在建置最後,直接將我們的修改好的 QEMU 直接加入其中

泛用 Template

當然我們也可以直接撰寫一個泛用的 template,我的情境需要用到 x86_64 以及 arm64 兩種環境,所以我可以改成泛用的 template 以供使用。

{% extends parent_template %}

{% set custom_patch_url = "http://mgmt.kojuro.date:8000/" %}
{% set custom_patch_path = "/patch/" %}
{% set custom_patch_version = "2.11+dfsg-1ubuntu7.6" %}
{% set custom_patch_arch = "amd64" %}
{% if base_arch == "aarch64" %}
    {% set custom_patch_arch = "arm64" %}
{% endif %}

{% block cinder_base_footer %}
# qemu-utils qemu-block-extra
ADD \
    {{ custom_patch_url }}/qemu-utils_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-block-extra_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_path }}/ 
RUN dpkg -i {{ custom_patch_path }}/*.deb
{% endblock %}

{% block nova_libvirt_footer %}
# qemu qemu-block-extra
# qemu-system qemu-user qemu-utils 
# qemu-system-arm qemu-system-mips qemu-system-ppc qemu-system-sparc qemu-system-x86 qemu-system-s390x qemu-system-misc
# qemu-system-common
ADD \
    {{ custom_patch_url }}/qemu-utils_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-arm_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-mips_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-ppc_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-sparc_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-x86_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-s390x_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-misc_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-system-common_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-user_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-block-extra_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \ 
    {{ custom_patch_path }}/ 
RUN dpkg -i {{ custom_patch_path }}/*.deb
{% endblock %}

{% block nova_compute_footer %}
# qemu-utils qemu-block-extra
ADD \
    {{ custom_patch_url }}/qemu-utils_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-block-extra_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_path }}/ 
RUN dpkg -i {{ custom_patch_path }}/*.deb
{% endblock %}

{% block glance_api_footer %}
# qemu-utils qemu-block-extra
ADD \
    {{ custom_patch_url }}/qemu-utils_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_url }}/qemu-block-extra_{{ custom_patch_version}}_{{ custom_patch_arch }}.deb \
    {{ custom_patch_path }}/ 
RUN dpkg -i {{ custom_patch_path }}/*.deb
{% endblock %}

Reference

OpenStack Docs Building Container Images Dockerfile Customisation