Nowe zmodernizowane etykiety w obrazach kontenerowych od EuroLinux

Nowe zmodernizowane etykiety w obrazach kontenerowych od EuroLinux

Od wielu lat wspieramy u klientów otwarte rozwiązania kontenerowe. Naszym złotym standardem jest udostępnianie kontenerów, które w regularnych cyklach są przebudowywane, testowane i dostarczane dla całej społeczności. Zgodnie z wewnętrzną polityką budujemy kontenery nie tylko pod rozwiązania naszej firmy, ale także dla innych systemów z rodziny Enterprise Linux.

Od wielu lat wspieramy u klientów otwarte rozwiązania kontenerowe. Naszym złotym standardem jest udostępnianie kontenerów, które w regularnych cyklach są przebudowywane, testowane i dostarczane dla całej społeczności. Zgodnie z wewnętrzną polityką budujemy kontenery nie tylko pod rozwiązania naszej firmy, ale także dla innych systemów z rodziny Enterprise Linux. W ten sposób organizacje mogą uzyskać pojedyncze źródło aktualizowanych obrazów kontenerowych, posiadające stabilny cykl życia.

EuroLinux należy do tej „jasnej strony mocy”, która dostarcza użytkownikom kompletny przepis mówiący o tym, w jaki sposób kontener został przygotowany (Dockerfile – repozytorium containers-rfc) oraz, co równie istotne, nie wycina sztucznie jego historii budowania. Pozwala ona bowiem, wraz ze wszystkimi plikami będącymi w wolnym dostępie, na stworzenie powtarzalnego kontenera w dowolnym środowisku i we własnym zakresie, a następnie porównanie go z kontenerami dostępnymi w rejestrach. Zwiększa to bezpieczeństwo, jak i również przejrzystość rozwiązania, gdyż administrator może nie tylko testować kontener statycznie i dynamicznie, ale także sam proces jego budowania.

Przykład dla obrazu EuroLinux 8:

[Alex@SpaceShipEL8 ~]$ podman image history eurolinux-8:latest
ID            CREATED      CREATED BY                                     SIZE        COMMENT
713ceb415c6c  3 weeks ago  CMD ["/bin/bash"]                              0 B         buildkit.dockerfile.v0
    3 weeks ago  ENV LOG4J_FORMAT_MSG_NO_LOOKUPS=true           0 B         buildkit.dockerfile.v0
    3 weeks ago  LABEL org.label-schema.schema-version=1.0 ...  0 B         buildkit.dockerfile.v0
    3 weeks ago  LABEL maintainer=Aleksander Baranowski     
    3 weeks ago  ADD eurolinux-8.tar.gz / # buildkit            252 MB      buildkit.dockerfile.v0

Podobny obraz UBI od firmy Red Hat:

[Alex@SpaceShipEL8 ~]$ podman image history ubi8:latest
ID CREATED CREATED BY SIZE COMMENT
552ac8ae4291 10 days ago 20.5 kB
10 days ago 235 MB Imported from -

W historii budowania kontenerów systemu EuroLinux widać między innymi etykiety (ang. label). Etykieta w świecie kontenerów, a w szczególności w Kubernetesie, jest parą typu klucz-wartość pozwalającą na grupowanie, filtrowanie, sortowanie i zarządzanie zasobami. Bez wątpienia jednym z istotniejszych zasobów Kubernetesa są obrazy kontenerów. Dlatego tak ważne jest, by posiadały one przynajmniej ogólnie ustandaryzowane etykiety.

Rys historyczny Etykiet

W czasach starożytnych (biorąc pod uwagę tempo rozwoju kontenerów), czyli ok. 4 lata temu, gdy budowaliśmy pierwsze kontenery, preferowanym sposobem etykietowania obrazów kontenerów był ten proponowany przez społecznościowy projekt label-schema oraz jego ostatnią wersję będącą Release Candidate 1. Obecnie projekt OCI (Open Container Initiative) proponuje podejście będące de facto standardem, które zostało opisane w oficjalnym repozytorium specyfikacji obrazów kontenerowych: Open Containers Initiative – Image Specification.

Przykładowe etykiety EuroLinux 8 przed zmianami, oparte jeszcze o label-schema:

[Alex@SpaceShipEL8 ~]$ podman inspect eurolinux-8:latest --format json | jq '.[0].Labels'
{
  "maintainer": "Aleksander Baranowski <***@euro-linux.com> (@AlexBaranowski)",
  "org.label-schema.build-date": "20220303",
  "org.label-schema.license": "GPLv2",
  "org.label-schema.name": "EuroLinux 8",
  "org.label-schema.schema-version": "1.0",
  "org.label-schema.url": "https://euro-linux.com",
  "org.label-schema.vcs-url": "https://github.com/EuroLinux/containers-rfc",
  "org.label-schema.vendor": "System - EuroLinux; Image - EuroLinux"
}

Poniżej prezentujemy unowocześnione podejście, używane od dłuższego czasu między innymi przez dystrybucję CentOS Stream. W przykładzie etykiety dla najnowszej wersji CentOS Stream 8 w czasie pisania artykułu:

[Alex@SpaceShipEL8 ~]$ podman inspect centos:stream8 --format json | jq '.[0].Labels'
{
  "architecture": "x86_64",
  "build-date": "2022-03-08T13:06:07.436525",
  "com.redhat.build-host": "cpt-1006.osbs.prod.upshift.rdu2.redhat.com",
  "com.redhat.component": "centos-stream-container",
  "com.redhat.license_terms": "https://centos.org/legal/licensing-policy/",
  "description": "CentOS Stream is a continuously delivered distro that tracks just ahead of Red Hat Enterprise Linux development. This image takes the Red Hat UBI and layers on content from CentOS Stream",
  "distribution-scope": "public",
  "io.buildah.version": "1.19.8",
  "io.k8s.description": "The Universal Base Image is designed and engineered to be the base layer for all of your containerized applications, middleware and utilities. This base image is freely redistributable, but Red Hat only supports Red Hat technologies through subscriptions for Red Hat products. This image is maintained by Red Hat and updated regularly.",
  "io.k8s.display-name": "CentOS Stream 8",
  "io.openshift.expose-services": "",
  "io.openshift.tags": "base centos centos-stream",
  "maintainer": "The CentOS Project",
  "name": "centos-stream",
  "release": "236",
  "summary": "Provides a CentOS Stream container based on the Red Hat Universal Base Image",
  "url": "https://access.redhat.com/containers/#/registry.access.redhat.com/ubi8/images/8.5-236",
  "vcs-ref": "3aadd00326f3dd6cfe65ee31017ab98915fddb56",
  "vcs-type": "git",
  "vendor": "Red Hat, Inc.",
  "version": "8"
}

Niestety nie wszystkie dystrybucje Enterprise Linux dbają o odpowiednie etykietowanie. Przeanalizujmy przykładowy kontener Oracle Linux w wersji 8. Na początek pobierzmy go z oficjalnego rejestru kontenerów Oracle:

[Alex@SpaceShipEL8 ~]$ podman pull oraclelinux:8
Resolved "oraclelinux" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull container-registry.oracle.com/os/oraclelinux:8...
Getting image source signatures
Copying blob 00e01bb8b231 done
Copying config c23ed56a96 done
Writing manifest to image destination
Storing signatures
c23ed56a96930c584033d69e8bd3846122df20f12c1869fa9d04f385c0293adc

Następnie sprawdźmy jego etykiety – a raczej ich brak :-)

[Alex@SpaceShipEL8 ~]$ podman inspect oraclelinux:8 --format json | jq '.[0].Labels'
[Alex@SpaceShipEL8 ~]$ podman inspect oraclelinux:8 | grep -i label
        "Labels": null,

Zmiany w etykietach EuroLinux

Jak napisaliśmy wcześniej, standard etykiet kontenerów uległ zmianie. W związku z modernizacją wprowadzaliśmy następujące usprawnienia:

  • maintainer został przeniesiony do jednej warstwy wraz z innymi etykietami. Ponadto, dane kontaktowe e-mail zostały zmienione na bardziej ogólne
  • org.label-schema.schema-version=”1.0″ zostało usunięte
  • org.label-schema.name -> name – w etykiecie `name` nazwa kontenera odpowiada teraz jego nazwie podawanej na linii komend. Przykładowo Rocky 8 został zmieniony na rocky-8
  • org.label-schema.vendor -> vendor
  • org.label-schema.url -> url
  • org.label-schema.vcs-url -> source
  • org.label-schema.license -> licenses – warto zauważyć, że license nie występował w standardzie label-schema. Zdarzało się jednak, że pojawiał się w poradnikach
  • org.label-schema.build-date -> created
  • etykieta architecture została dodana
  • etykieta version została dodana
  • etykieta description została dodana
  • etykieta summary została dodana
  • etykieta io.k8s.display-name została dodana
  • etykieta io.k8s.description została dodana
  • etykieta io.openshift.tags została dodana.

Warto też zwrócić uwagę na to, iż etykieta name powinna nazywać się w chwili obecnej title. Jednak ze względu na szerokie zastosowanie jej w miejscach takich jak poradniki certyfikacyjne – jak np. ten wpis firmy Red Hat – nie zmieniamy jej.

Zaktualizowane etykiety na przykładzie EuroLinux 7

[Alex@SpaceShipEL8 ~]$ podman inspect eurolinux-7 --format json | jq '.[0].Labels'
{
  "architecture": "x86_64",
  "created": "20220327",
  "description": "Provides EuroLinux 7 Base Container",
  "io.k8s.description": "Provides EuroLinux 7 Base Container",
  "io.k8s.display-name": "EuroLinux 7 Base Container",
  "io.openshift.tags": "base eurolinux",
  "licenses": "GPLv2",
  "maintainer": "EuroLinux Containers team <******@euro-linux.com>",
  "name": "eurolinux-7",
  "source": "https://github.com/EuroLinux/containers-rfc",
  "summary": "EuroLinux 7 Base Container",
  "url": "https://euro-linux.com",
  "vendor": "EuroLinux",
  "version": "7"
}

Przykładowy Dockerfile (AlmaLinux 8) przed i po zmianie

Jak wcześniej wspominaliśmy, wszystkie Dockerfile oraz pliki, z których tworzone są kontenery, udostępniamy w repozytorium Git. Jest to równocześnie miejsce, w którym można zgłaszać propozycje, ulepszenia (RFC – Request For Change) oraz błędy.

Dockerfile AlmaLinux 8 przed zmianą:

FROM scratch
ADD almalinux-8.tar.gz /

LABEL maintainer="Aleksander Baranowski <****@euro-linux.com> (@AlexBaranowski)"
LABEL org.label-schema.schema-version="1.0" \\
  org.label-schema.name="AlmaLinux 8" \\
  org.label-schema.vendor="System - AlmaLinux; Image - EuroLinux" \\
  org.label-schema.url="https://euro-linux.com"\\
  org.label-schema.vcs-url="https://github.com/EuroLinux/containers-rfc"\\
  org.label-schema.license="GPLv2" \\
  org.label-schema.build-date="$(date +%Y%m%d)"

CMD ["/bin/bash"]

Dockerfile AlmaLinux 8 po zmianach:

FROM scratch
ADD almalinux-8.tar.gz /

LABEL maintainer="EuroLinux Containers team <******@euro-linux.com>" \
  name="almalinux-8" \
  vendor="System - AlmaLinux; Image - EuroLinux" \
  url="https://euro-linux.com"\
  source="https://github.com/EuroLinux/containers-rfc"\
  licenses="GPLv2" \
  created="20220327" \
  architecture="x86_64" \
  summary="AlmaLinux 8 Base Container" \
  description="Provides AlmaLinux 8 Base Container" \
  version="8" \
  io.k8s.display-name="AlmaLinux 8 Base Container" \
  io.k8s.description="Provides AlmaLinux 8 Base Container" \
  io.openshift.tags="base almalinux"

CMD ["/bin/bash"]

Podsumowanie

Mimo iż dla wielu użytkowników końcowych etykiety nie mają większego znaczenia, istnieje pewien zbiór ich zastosowań – szczególnie przy orkiestratorach takich jak Kubernetes czy oparty na nim OpenShift. Zmiany etykiet zostały wprowadzone szczególnie dla osób pracujących z tymi rozwiązaniami.

Bibliografia / warto przeczytać

https://github.com/opencontainers/image-spec/blob/main/annotations.md
https://developers.redhat.com/articles/2021/11/11/best-practices-building-images-pass-red-hat-container-certification
https://snyk.io/blog/how-and-when-to-use-docker-labels-oci-container-annotations/ https://github.com/label-schema/label-schema.org

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.